# luri-cursor

> Eases fetching of large data sets.

Latest version **2.0.2** (published 2018-04-19) · Apache-2.0 license · 0 weekly downloads

## Install

```sh
npm install luri-cursor
pnpm add luri-cursor
yarn add luri-cursor
bun add luri-cursor
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.2 |
| Published | 2018-04-19 |
| First published | 2018-02-10 |
| Weekly downloads | 0 |
| License | Apache-2.0 |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 9.2 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Manix |
| Maintainers | manix |

## Links

- npm: https://www.npmjs.com/package/luri-cursor
- Repository: https://github.com/luri/cursor
- Homepage: https://github.com/luri/cursor#readme
- Issues: https://github.com/luri/cursor/issues
- npm.io page: https://npm.io/package/luri-cursor

## Recent versions

- 2.0.2 (latest) — 2018-04-19
- 2.0.1 — 2018-02-25
- 2.0.0 — 2018-02-25
- 1.0.0 — 2018-02-10

## README

# luri-cursor

Fetches large data sets in chunks (aka pagination). Maintains state internally.

### How it works

In the constructor you must provide a URL with placeholders for data required by your API. 

Let's say you are fetching resources from `http://myapi.com/posts` where each page of content is identified by a GET parameter called page. Then your url parameter will look like `http://myapi.com/posts?page=<page>`.

The cursor maintains a state object which indicates how far in the data it is. However there are limitless possibilities of required inputs, so continuing the example above, the state object we will need will look like so

    {
      page: 1
    }

Whenever a new page is fetched the cursor must update its internal state in order to be ready to fetch the next one. For this purpose you need to define a `setState` method which returns the new state.

### How to use

After including `luri-cursor` in your project you need to extend the abstract class exported in the package and provide your `setState` implementation. The method receives the current cursor state and the fetched data as parameters. For our posts example the implementation will look like so

    const Cursor = require("luri-cursor");

    class PostsCursor extends Cursor {

      setState(oldState, posts) {
        return {
          page: oldState.page + 1
        }
      }
    }

Now we are ready to start fetching some posts.

    let cursor = new PostsCursor("http://myapi.com/posts?page=<page>", { page: 1 });

    cursor.fetch().then(posts => console.log("First page", posts)).then(() => {
      cursor.fetch().then(posts => console.log("Second page", posts))
    });

By default it is assumed that the returned data will be in JSON format, if that's not the case you can modify the `execute` method to suit your needs. It is given a URL string (populated with data from your state), it must retrieve the data and return a promise, definition below.

    execute(url: string): Promise<any>;

---
_Source: https://npm.io/package/luri-cursor · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
