UNPKG

@uirouter/core

Version:

UI-Router Core: Framework agnostic, State-based routing for JavaScript Single Page Apps

115 lines 5.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Resolvable = exports.defaultResolvePolicy = void 0; var common_1 = require("../common/common"); var coreservices_1 = require("../common/coreservices"); var trace_1 = require("../common/trace"); var strings_1 = require("../common/strings"); var predicates_1 = require("../common/predicates"); var predicates_2 = require("../common/predicates"); // TODO: explicitly make this user configurable exports.defaultResolvePolicy = { when: 'LAZY', async: 'WAIT', }; /** * The basic building block for the resolve system. * * Resolvables encapsulate a state's resolve's resolveFn, the resolveFn's declared dependencies, the wrapped (.promise), * and the unwrapped-when-complete (.data) result of the resolveFn. * * Resolvable.get() either retrieves the Resolvable's existing promise, or else invokes resolve() (which invokes the * resolveFn) and returns the resulting promise. * * Resolvable.get() and Resolvable.resolve() both execute within a context path, which is passed as the first * parameter to those fns. */ var Resolvable = /** @class */ (function () { function Resolvable(arg1, resolveFn, deps, policy, data) { this.resolved = false; this.promise = undefined; if (arg1 instanceof Resolvable) { (0, common_1.extend)(this, arg1); } else if ((0, predicates_1.isFunction)(resolveFn)) { if ((0, predicates_2.isNullOrUndefined)(arg1)) throw new Error('new Resolvable(): token argument is required'); if (!(0, predicates_1.isFunction)(resolveFn)) throw new Error('new Resolvable(): resolveFn argument must be a function'); this.token = arg1; this.policy = policy; this.resolveFn = resolveFn; this.deps = deps || []; this.data = data; this.resolved = data !== undefined; this.promise = this.resolved ? coreservices_1.services.$q.when(this.data) : undefined; } else if ((0, predicates_1.isObject)(arg1) && arg1.token && (arg1.hasOwnProperty('resolveFn') || arg1.hasOwnProperty('data'))) { var literal = arg1; return new Resolvable(literal.token, literal.resolveFn, literal.deps, literal.policy, literal.data); } } Resolvable.prototype.getPolicy = function (state) { var thisPolicy = this.policy || {}; var statePolicy = (state && state.resolvePolicy) || {}; return { when: thisPolicy.when || statePolicy.when || exports.defaultResolvePolicy.when, async: thisPolicy.async || statePolicy.async || exports.defaultResolvePolicy.async, }; }; /** * Asynchronously resolve this Resolvable's data * * Given a ResolveContext that this Resolvable is found in: * Wait for this Resolvable's dependencies, then invoke this Resolvable's function * and update the Resolvable's state */ Resolvable.prototype.resolve = function (resolveContext, trans) { var _this = this; var $q = coreservices_1.services.$q; // Gets all dependencies from ResolveContext and wait for them to be resolved var getResolvableDependencies = function () { return $q.all(resolveContext.getDependencies(_this).map(function (resolvable) { return resolvable.get(resolveContext, trans); })); }; // Invokes the resolve function passing the resolved dependencies as arguments var invokeResolveFn = function (resolvedDeps) { return _this.resolveFn.apply(null, resolvedDeps); }; var node = resolveContext.findNode(this); var state = node && node.state; var asyncPolicy = this.getPolicy(state).async; var customAsyncPolicy = (0, predicates_1.isFunction)(asyncPolicy) ? asyncPolicy : common_1.identity; // After the final value has been resolved, update the state of the Resolvable var applyResolvedValue = function (resolvedValue) { _this.data = resolvedValue; _this.resolved = true; _this.resolveFn = null; trace_1.trace.traceResolvableResolved(_this, trans); return _this.data; }; // Sets the promise property first, then getsResolvableDependencies in the context of the promise chain. Always waits one tick. return (this.promise = $q .when() .then(getResolvableDependencies) .then(invokeResolveFn) .then(customAsyncPolicy) .then(applyResolvedValue)); }; /** * Gets a promise for this Resolvable's data. * * Fetches the data and returns a promise. * Returns the existing promise if it has already been fetched once. */ Resolvable.prototype.get = function (resolveContext, trans) { return this.promise || this.resolve(resolveContext, trans); }; Resolvable.prototype.toString = function () { return "Resolvable(token: ".concat((0, strings_1.stringify)(this.token), ", requires: [").concat(this.deps.map(strings_1.stringify), "])"); }; Resolvable.prototype.clone = function () { return new Resolvable(this); }; Resolvable.fromData = function (token, data) { return new Resolvable(token, function () { return data; }, null, null, data); }; return Resolvable; }()); exports.Resolvable = Resolvable; //# sourceMappingURL=resolvable.js.map