# trigger-simulator

> Simple trigger simulator

Latest version **0.0.7** (published 2018-03-22) · MIT license · 0 weekly downloads

## Install

```sh
npm install trigger-simulator
pnpm add trigger-simulator
yarn add trigger-simulator
bun add trigger-simulator
```

## 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.7 |
| Published | 2018-03-22 |
| First published | 2018-03-21 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 75.4 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | Eprincev Egor |
| Maintainers | eprincev.egor |
| Keywords | trigger, db, sql, simulator |

## Links

- npm: https://www.npmjs.com/package/trigger-simulator
- Repository: https://github.com/eprincev-egor/trigger-simulator
- Homepage: https://github.com/eprincev-egor/trigger-simulator#readme
- npm.io page: https://npm.io/package/trigger-simulator

## Alternatives

- [angular-pipes](https://npm.io/package/angular-pipes.md) — 5.6K weekly downloads
- [@ng-web-apis/midi](https://npm.io/package/@ng-web-apis/midi.md) — 2.6K weekly downloads
- [happn-3](https://npm.io/package/happn-3.md) — 1.6K weekly downloads
- [@opensip-cli/lang-go](https://npm.io/package/@opensip-cli/lang-go.md) — 1.2K weekly downloads
- [mongoose-typescript](https://npm.io/package/mongoose-typescript.md) — 85 weekly downloads

## Recent versions

- 0.0.7 (latest) — 2018-03-22
- 0.0.6 — 2018-03-22
- 0.0.5 — 2018-03-22
- 0.0.4 — 2018-03-21
- 0.0.3 — 2018-03-21
- 0.0.2 — 2018-03-21
- 0.0.1 — 2018-03-21

## README

# Trigger simulator
Test your trigger logic on JavaScript with trigger simulator  
![CI status](https://circleci.com/gh/eprincev-egor/trigger-simulator.svg?style=shield)

## install
```$ npm i```  
```$ npm build```

## usage
```$ npm run create template=default project=Demo```  
```$ npm run watch```  
```$ npm run test```

Now in dir ./tests you can see new folder Demo.
Write your code in Demo/Demo-spec.js

## api
```js
"use strict";

const {Table} = require("trigger-simulator");

class MyTable extends Table {
    super();
    constructor() {
        this.columns = {
            // id is primary key with serial
            id: "number",
            name: "text",
            note: "text",
            phone1: "text",
            sum: {
                type: "number",
                // default value on insert
                // can be function() {return value}
                default: 10,
                // not null
                nulls: false
            }
        };
        
        // unique constraints
        this.unique = [{
            name: "unique_phone1",
            columns: ["phone1"]
        }];
    }
}

let table = new MyTable();

// insert empty row
let insertedRow1 = table.insert(); // {id: 1}

// insert with data
let insertedRow2 = table.insert({ name: "Hello" }); // {id: 2, name: "Hello"}

// insert array
let insertedRows = table.insert([
    {name: "Row 1"},
    {name: "Row 2"}
]);
// result
// [
//    {id: 3, name: "Row 1"},
//    {id: 4, name: "Row 2"}
// ]

// select one value
// (throw warning, only one row must be match filter)
let name1 = table.selectValue("name", row => row.id == 2); // "Hello"

// select one row
// (throw warning, only one row must be match filter)
let row1 = table.selectRow(row => row.name == "Hello"); // {id: 2, name: "Hello"}

// select some rows
let rows = table.select(row => /Row/.test(row.name));
// result
// [
//    {id: 3, name: "Row 1"} ,
//    {id: 4, name: "Row 2"}
// ]

// update all rows
table.update({ note: "nice" });
let rowsAfterUpdate = table.select(row ==> true);
// result
// [
//    {id: 1, note: "nice"} ,
//    {id: 2, name: "Hello", note: "nice"} ,
//    {id: 3, name: "Row 1", note: "nice"} ,
//    {id: 4, name: "Row 2", note: "nice"}
// ]


// update some rows
table.update({ name: "Name #1" }, row => row.id == 1);

// up sum for all rows
table.update(row => ({
    sum: row.sum + 2
}) );

// up sum for some rows
table.update(
    // set
    row => ({
        sum: row.sum * row.sum
    }), 
    // where
    row => row.id > 3 
);

// delete all rows
table.delete();

// delete some rows
table.delete(row => row.id % 2 === 0);

// Triggers:

// before insert
table.createTrigger({
    before: {
        insert: true
    }
}, function(event) {
    event.tg_op;      // insert
    event.isBefore;   // true
    event.isAfter;    // false
    event.newRow;     // inserting row object

    // in before trigger you can change data
    event.newRow.someColumns = "some value";
});

// after insert
table.createTrigger({
    after: {
        insert: true
    }
}, function(event) {
    event.tg_op;      // insert
    event.isBefore;   // false
    event.isAfter;    // true
    event.newRow;     // inserting row object
});

// before update
table.createTrigger({
    before: {
        update: true
    }
}, function(event) {
    event.tg_op;      // update
    event.isBefore;   // true
    event.isAfter;    // false
    event.newRow;     // row with changes
    event.oldRow;     // row without changes

    // in before trigger you can change data
    event.newRow.someColumns = "some value";
});

// after update
table.createTrigger({
    after: {
        update: true
    }
}, function(event) {
    event.tg_op;      // update
    event.isBefore;   // false
    event.isAfter;    // true
    event.newRow;     // row with changes (including before triggers changes)
    event.oldRow;     // row without changes
});

// update on columns
table.createTrigger({
    // before or after
    after: {
        update: ["some_column"]
    }
}, function(event) {
    // event also in simple update trigger
});

// before delete
table.createTrigger({
    before: {
        delete: true
    }
}, function(event) {
    event.tg_op;      // delete
    event.isBefore;   // true
    event.isAfter;    // false
    event.oldRow;     // deleting row object
});

// after delete
table.createTrigger({
    after: {
        delete: true
    }
}, function(event) {
    event.tg_op;      // delete
    event.isBefore;   // false
    event.isAfter;    // true
    event.oldRow;     // deleting row object
});

```

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