# @cqrsfk/ob

> object observer

Latest version **0.0.16** (published 2019-10-02) · Apache-2.0 license · 0 weekly downloads

## Install

```sh
npm install @cqrsfk/ob
pnpm add @cqrsfk/ob
yarn add @cqrsfk/ob
bun add @cqrsfk/ob
```

## Health

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

Positive: no vulnerabilities.

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

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.0.16 |
| Published | 2019-10-02 |
| First published | 2019-08-08 |
| Weekly downloads | 0 |
| License | Apache-2.0 |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 2 |
| Unpacked size | 72.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | zalelion |
| Maintainers | leozale |

## Links

- npm: https://www.npmjs.com/package/@cqrsfk/ob
- Repository: https://github.com/zalelion/ob
- Homepage: https://github.com/zalelion/ob#readme
- Issues: https://github.com/zalelion/ob/issues
- npm.io page: https://npm.io/package/@cqrsfk/ob

## Dependencies (2)

- [debug](https://npm.io/package/debug.md) ^4.1.1
- [lodash](https://npm.io/package/lodash.md) ^4.17.15

## Recent versions

- 0.0.16 (latest) — 2019-10-02
- 0.0.15 — 2019-10-02
- 0.0.14 — 2019-10-02
- 0.0.13 — 2019-09-30
- 0.0.12 — 2019-09-30
- 0.0.11 — 2019-09-29
- 0.0.10 — 2019-09-29
- 0.0.9 — 2019-08-08

## README

# Object observer

### observe before get object's property

```js
// returned before observed, internal execution middle.get(argv)
obj.sub.name;
```

### observe before/after set object's property

```js
// before observed , internal execution middle.beforeSet(argv)
obj.sub.name = "zale";
// after observed , internal execution middle.afterSet(argv)
```

### observe before/after apply object's method

```js
// before observed , internal execution middle.beforeApply(argv)
obj.sub.change("lion");
// after observed , internal execution middle.afterApply(argv)
```

### observe before/after delete object's property

```js
// before observed, internal execution middle.beforeDelete(argv)
delete obj.sub.name;
// after observed, internal execution middle.afterApply(argv)
```

# Install

> npm install @zalelion/ob

# API

```ts
import { Observer } from "@zalelion/ob";

var obj = {};

const { proxy, emitter, use, isProxy } = new Observer(obj);

```

# Middleware

## Middle interface

```ts
interface MiddlewareConstructor {
  new (ob: Observer<any>): Middleware;
}

interface Middleware {
  get?: GetMiddle;
  beforeSet?: BeforeSetMiddle;
  afterSet?: AfterSetMiddle;
  beforeApply?: BeforeApplyMiddle;
  afterApply?: AfterApplyMiddle;
  beforeDelete?: BeforeDeleteMiddele;
  afterDelete?: AfterDeleteMiddle;
}
```

## Custom JSON middleware

```js
// ES6
class JSONMiddle {
  constructor(observer) {
    this.observer = observer;
  }

  get({ root, parentPath, key }) {
    // E.g.
    // obj.json , then parentPath is "" null string.
    // obj.sub.json , then parentPath is "sub".
    if (value && !parentPath && key === "json") {
      return JSON.parse(JSON.stringify(root));
    }
    return value;
  }
}
```

### Observe and use middleware

```js
const { Observer, factory } = require("@zalelion/ob");

const obj = {
  name: "Zale Lion",
  change(name) {
    this.name = name;
  }
};

// Use global's middleware
// Observer.Middles.push(JSONMiddle);

// For a class of objects.
// const SubObserver = factory();
// SubObserver.Middles.push(JSONMiddle);

const { use, proxy: proxyObj } = new Observer(obj);
// use middle for only a assign object
use(JSONMiddle);
```

### use

```js
console.log(proxyObj.json); // Output:  {name:"Zale Lion"}
```

## Third-party middleware
- [Change](https://github.com/zalelion/ob-middle-change)
- [Sync](https://github.com/zalelion/ob-middle-sync)

# License
AGPL-3.0

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