'use strict'; var entries = require('object.entries'); /** * @template {object} T * @param {T} start * @param {Record unknown) & { key?: string }>} props * @returns {Promise} */ function promiseRipple(start, props) { /** @type {Promise} */ var seed = Promise.resolve(null); return entries(props).reduce(function (acc, _a) { var key = _a[0], action = _a[1]; return acc.then(function () { if (typeof action !== 'function') { throw new Error('property values must be functions'); } var fn = /** @type {(data: object) => unknown} */ (action); return Promise.resolve(fn(start)).then(function (value) { var _a; if (start === value) { return value; } Object.assign(start, (_a = {}, _a[key] = value, _a)); return value; }); }); }, seed) .then(function () { return start; }); } module.exports = promiseRipple;