import { NodeDefinition, NodeLike, StatelessGraphNode, StatelessNodeDefinition, StatelessNodeType } from '../../types/graph'; import { RootAndPath } from '../../utils/ref'; /** * An instance of the [[setResult]] node. * See the [[setResult]] documentation to find out more. */ export interface SetResultNode extends StatelessGraphNode<'setResult', SetResultNodeProperties> { } /** * A definition of the [[setResult]] node. * See the [[setResult]] documentation to find out more. */ export interface SetResultNodeDefinition extends StatelessNodeDefinition<'setResult', SetResultNodeProperties> { } export interface SetResultNodeProperties { target: NodeDefinition; value: NodeDefinition; } /** * The implementation of the [[setResult]] node. * See the [[setResult]] documentation to learn more. */ export declare const SetResultNodeType: StatelessNodeType<'setResult', SetResultNodeProperties>; /** * Creates instance of the [[setResult]] node, which allows for setting values of certain nodes, e.g. [[variable]], * [[fromPromise]] and [[placeholder]]. Compared to the [[set]] node, the [[setResult]] node first * resolves the value to a static node before setting the settable node. * * The output of a [[setResult]] is the same as a [[value]] property. See the "**Setting * a variable**" example for more information. * * When resolving a [[setResult]] against an asynchronous node like [[fromPromise]], the value from * the resolver will wait for [[fromPromise]] to update to new value, then emit value from * [[setResult]]. See the "**Setting asynchronous nodes**" example for more information. * * * @example **Setting a variable** * ```js * import muster, { setResult, variable } from '@dws/muster'; * * const app = muster({ * name: variable('Bob'), * }); * * console.log('Setting variable'); * app.resolve(setResult('name', 'Jane')).subscribe((result) => { * // result === 'Jane' * console.log('SetResult resolved'); * }); * console.log('End'); * * // Console output: * // Setting variable * // SetResult resolved * // End * ``` * This example demonstrates how a [[setResult]] can be used to update the value of a [[variable]]. * The [[setResult]] also returns the value setResult to the target node. * See the [[variable]] documentation to learn more about the lifecycle of variables in * Muster. * * * @example **Setting asynchronous nodes** * ```ts * import muster, { fromPromise, setResult } from '@dws/muster'; * * let savedName = 'Bob'; * * const app = muster({ * name: fromPromise({ * get: () => Promise.resolve(savedName), * set: (props, newValue) => new Promise((resolve) => { * // newValue is a ValueNode * savedName = newValue; * resolve(); * }), * }), * }); * * console.log('Setting variable'); * app.resolve(setResult('name', 'Jane')).subscribe((result) => { * // result === 'Jane' * console.log('SetResult resolved'); * }); * console.log('End'); * * // Console output: * // Setting variable * // End * // SetResult resolved * ``` * This example demonstrates that a [[setResult]] waits for the target value to be updated before * returning a result. * See the [[fromPromise]] for more information on how to make asynchronous API requests. * * The fact that the [[setResult]] waits for the operation to finish is very useful when using it as * part of a [[series]], [[fn]] or [[action]]. * * * @example **Computing value before saving** * ```javascript * import muster, { format, ref, setResult, variable } from '@dws/muster'; * * const app = muster({ * url: variable('/'), * }); * * console.log('Getting URL'); * app.resolve(ref('url')).subscribe((result) => { * console.log('URL:', result); * }); * * console.log('Setting URL'); * await app.resolve(setResult('url', format('/article/${id}', { * id: 'test-id', * }))); * * // Console output: * // Getting URL * // URL: / * // Setting URL * // URL: /article/test-id * ``` * This example shows how to use the [[setResult]] node to resolve the value before setting the node. */ export declare function setResult(rootAndPath: RootAndPath, value: NodeLike): SetResultNodeDefinition; export declare function setResult(target: NodeDefinition, value: NodeLike): SetResultNodeDefinition; export declare function setResult(root: NodeDefinition, path: NodeLike | Array, value: NodeLike): SetResultNodeDefinition; export declare function setResult(path: NodeLike | Array, value: NodeLike): SetResultNodeDefinition; export declare function isSetResultNodeDefinition(value: NodeDefinition): value is SetResultNodeDefinition;