Skip to main content

Actions runners

Note​

Many actions runners are available. Each may:

  • depend on a minimal package version
  • only be available in a given use case (JSON:API, REST, HTTP, etc.)
  • provide a given context to next enhancers or runners
  • require a given context from previous enhancers or runners

Examples of this guide will omit imports of your action factories or models to provide shorter examples.

Common​

none​

requires: Adapter

Run the action and ignore the content of the result. Adapter errors are not caught and so may be thrown.

Example​

import { none } from 'foscia/core';

await action().run(none());

Returns​

{Promise<void>}

raw​

requires: Adapter

Run the action and retrieve the raw adapter's data.

Example​

import { raw } from 'foscia/core';

// When using HttpAdapter, raw result is a fetch Response object.
const response = await action().run(raw());
// You may also transform the data by passing a function.
const data = await action().run(raw((r) => r.json()));

Arguments​

  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<AD>} where AD is your adapter's data (e.g. a fetch Response object) or a transformed data if transform callback was provided.

all​

requires: Adapter, Deserializer, Model

Run the action and deserialize an array of model's instance.

Example​

import { all } from 'foscia/core';

const posts = await action().run(all());

Arguments​

  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I[]>} where I is an instance of the targeted model or a transformed data if transform callback was provided.

one​

requires: Adapter, Deserializer, Model

Run the action and deserialize one model's instance. Returns null when not found.

Example​

import { one } from 'foscia/core';

const post = await action().run(one());

Arguments​

  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I | null>} where I is an instance of the targeted model or a transformed data if transform callback was provided.

oneOrFail​

requires: Adapter, Deserializer, Model

Run the action and deserialize one model's instance. Throws an ExpectedRunFailureError when not found or empty result.

Example​

import { oneOrFail } from 'foscia/core';

const post = await action().run(oneOrFail());

Arguments​

  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I>} where I is an instance of the targeted model or a transformed data if transform callback was provided.

oneOrCurrent​

requires: Adapter, Deserializer, Model, Instance

Run the action and deserialize one model's instance. Returns current instance when not found or empty result.

Example​

import { oneOrCurrent } from 'foscia/core';

const post = await action().run(oneOrCurrent());

Arguments​

  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I>} where I is an instance of the targeted model or a transformed data if transform callback was provided.

oneOr​

requires: Adapter, Deserializer, Model

Run the action and deserialize one model's instance.

Example​

import { oneOr } from 'foscia/core';

const post = await action().run(oneOr(() => null));

Arguments​

  • {Function} nilRunner the runner to use when one result is empty
  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I>} where I is an instance of the targeted model, a transformed data if transform callback was provided or the nilRunner result.

cached​

requires: Cache, Model, Id

Retrieve an instance from the cache. If the instance is not in cache or if the included relations are not loaded, returns null.

Example​

import { cached } from 'foscia/core';

const post = await action().run(cached());

Arguments​

  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I | null>} where I is an instance of the targeted model or a transformed data if transform callback was provided.

cachedOrFail​

requires: Cache, Model, Id

Retrieve an instance from the cache. If the instance is not in cache or if the included relations are not loaded, throws an ExpectedRunFailureError.

Example​

import { cachedOrFail } from 'foscia/core';

const post = await action().run(cachedOrFail());

Arguments​

  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I>} where I is an instance of the targeted model or a transformed data if transform callback was provided.

cachedOr​

requires: Cache, Model, Id

Retrieve an instance from the cache. If the instance is not in cache or if the included relations are not loaded, runs the given runner.

Example​

import { cachedOr } from 'foscia/core';

const post = await action().run(cachedOr(() => null));

Arguments​

  • {Function} nilRunner the runner to use when cached result is empty
  • {Function | undefined} transform the callback to transform the data object

Returns​

{Promise<I>} where I is an instance of the targeted model, a transformed data if transform callback was provided or the nilRunner result.

catchIf​

Run given runner and catch errors using catchCallback. If catchCallback is omitted, will return null on error. If catchCallback returns a function, will run it as an action's runner. Else, will ignore error and return null only if callback for error is truthy.

Example​

import { catchIf, one } from 'foscia/core';

const postOrNull = await action().run(
catchIf(one(), (error) => error instanceof ErrorToCatch),
);

Arguments​

  • {Function} runner the runner to run and catch errors from
  • {Function | undefined} catchCallback the callback to use when an error is caught

Returns​

{Promise<T>} where T is either the runner result, the catch runner result or null.

JSON:API​

usingDocument​

only: JSON:API

Append the JSON:API document object to data object. Use it as the parameter of all and one (and derivatives) runners.

Example​

import { all } from 'foscia/core';
import { usingDocument } from 'foscia/jsonapi';

const data = await action().run(all(usingDocument));
data.instances; // Model instances.
data.document; // JSON:API document with meta, etc.