# iscope

> Create a scope that can be accessed from nested function calls

Latest version **0.0.7** (published 2020-06-29) · ISC license · 0 weekly downloads

## Install

```sh
npm install iscope
pnpm add iscope
yarn add iscope
bun add iscope
```

## Health

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

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

Warnings: low downloads; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.0.7 |
| Published | 2020-06-29 |
| First published | 2020-06-13 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 17.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | linq2js |
| Keywords | scope, functional, context |

## Links

- npm: https://www.npmjs.com/package/iscope
- Homepage: https://github.com/linq2js/use-scope#readme
- Issues: https://github.com/linq2js/use-scope/issues
- npm.io page: https://npm.io/package/iscope

## Recent versions

- 0.0.7 (latest) — 2020-06-29
- 0.0.6 — 2020-06-21
- 0.0.5 — 2020-06-15
- 0.0.4 — 2020-06-13
- 0.0.3 — 2020-06-13
- 0.0.2 — 2020-06-13
- 0.0.1 — 2020-06-13

## README

# iscope

Create a scope that can be accessed from nested function calls

## Creating simple scope

```js
import iscope from 'iscope';
const funcA = () => {
  const value = iscope();
  return value + 1;
};

const funcB = () => {
  const value = iscope();
  return value + 2;
};
const initialValue = 1;
iscope(initialValue, () => {
  const a = funcA();
  const b = funcB();
  console.log(a); // 2
  console.log(b); // 3
});
```

## Easy to write unit testing

```js
import iscope from 'iscope';

const getTodoById = (id) => {
  const todos = iscope();
  return todos.find((x) => x.id === id);
};

test('found', () => {
  const result = iscope([{id: 1}, {id: 2}], () => getTodoById(1));
  expect(result).toEqual({id: 1});
});

test('not found', () => {
  const result = iscope([], () => getTodoById(1));
  expect(result).toBeUndefined();
});
```

## Multiple scopes

```js
import iscope from 'iscope';

const valueA = iscope(() => 1);
const valueB = iscope(() => 2);
const sum = () => valueA() + valueB();

test('A + B = 3', () => {
  const result = sum();
  expect(result).toBe(3);
});

test('A + B = 6', () => {
  const result = iscope(
    [
      [valueA, 2],
      [valueB, 4],
    ],
    sum,
  );
  expect(result).toBe(6);
});
```

## Dependency injection

```js
import iscope from 'iscope';
import express from 'express';

const useHttpContext = iscope(() => null);

const useHttpRequest = () => {
  const httpContext = useHttpContext();
  return httpContext.request;
};

const useHttpResponse = () => {
  const httpContext = useHttpContext();
  return httpContext.response;
};

const useRequestQuery = () => {
  const httpRequest = useHttpRequest();
  return httpRequest.query;
};

const useTextResult = (result) => {
  const response = useHttpResponse();
  response.send(result);
};

const sayHi = () => {
  const {name} = useRequestQuery();
  useTextResult(`Hi ${name}!!!`);
};

const app = express();
app.get('hi', (request, response) => {
  useHttpContext({request, response}, sayHi);
});
```

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