https://github.com/f/honst
Fixes your dataset according to your rules.
https://github.com/f/honst
correction data-integrity
Last synced: 10 months ago
JSON representation
Fixes your dataset according to your rules.
- Host: GitHub
- URL: https://github.com/f/honst
- Owner: f
- License: mit
- Created: 2020-12-21T01:22:54.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2023-01-06T17:28:47.000Z (about 3 years ago)
- Last Synced: 2025-02-21T06:02:42.795Z (11 months ago)
- Topics: correction, data-integrity
- Language: JavaScript
- Homepage:
- Size: 3.7 MB
- Stars: 68
- Watchers: 6
- Forks: 5
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ⛓️ honst
> The name: I wanted it to be "honest", but it was occupied, so I removed a letter, and it became "honst".
Data Integrity fixer for an **object matrix**.
## Use Cases
- On editing a **joined** matrix data needs the data integrity to be kept.
- Keeping your local state correct.
## Demo

You can play with honst on CodeSandbox:
[](https://codesandbox.io/s/honst-demo-6s187?fontsize=14&hidenavigation=1&theme=light)
## Overview
```js
const data = [
{ username: "johndoe", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe", name: "John", surname: "Doe", age: "25" },
{ username: "johndoe2", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe2", name: "John", surname: "Doez", age: "22" },
]
```
According to `username` field, there are many integrity issues around the array. So let **honst** fix these:
```diff
[
{ username: "johndoe", name: "John", surname: "Doe", age: 22 },
- { username: "johndoe", name: "John", surname: "Doe", age: 25 },
+ { username: "johndoe", name: "John", surname: "Doe", age: 22 },
{ username: "johnapple", name: "John", surname: "Apple", age: 29 },
- { username: "johnapple", name: "John", surname: "Orange", age: 22 },
+ { username: "johnapple", name: "John", surname: "Apple", age: 29 },
]
```
1. Referencing to `data[0].username`, `name`, `surname`, and `age` should be `John`, `Doe` and `22`.
2. But `data[1].age` is `25` and it should be fixed.
3. Referencing to `data[3].username`, `name`, `surname`, and `age` should be `John`, `Apple` and `29`.
4. But `data[1].age` is `25`, `data[1].surname` is `Orange` and these should be fixed as well.
**honst** simply fixes these integrity issues.
## Usage
Install using `npm` or `yarn`:
```
npm install honst
# or
yarn add honst
```
Now you can start:
```js
import { honst } from 'honst';
const { data, delta } = honst({
data: [
{ username: "johndoe", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe", name: "John", surname: "Doe", age: "25" }
],
pivot: 0, // an index number, "scan" or "reverse-scan"
delta: true, // boolean
rules: {
// the ruleset of integrity
// e.g. we want all names, surnames and ages to be same according to "username"
name: ["username"],
surname: ["username"],
age: ["username"],
}
})
```
This will generate following data:
```js
const fixedData = {
data: [
{ username: "johndoe", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe", name: "John", surname: "Doe", age: "22" },
],
delta: [
{
candidatePath: "age", // the path of the field
falseValue: "25", // the wrong value
candidateValue: "22", // the candidate value
pivot: 0, // the pivot row index
candidateIndex: 1, // the false row index
}
]
}
```
## Scanning and Reverse Scanning
Just pass `pivot` value `scan` or `reverse-scan`.
If you want to fix all the rows from **top-down** or **bottom-up**, this will scan the data and fix'em all.
```js
const { data, delta } = honst({
data: [
{ username: "johndoe", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe", name: "John", surname: "Doe", age: "25" },
{ username: "johndoe2", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe2", name: "John", surname: "Doez", age: "22" },
],
pivot: "scan",
delta: true,
rules: {
name: ["username"],
surname: ["username"],
age: ["username"],
}
})
```
This will generate the following:
```js
const fixedData = [
{ username: "johndoe", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe", name: "John", surname: "Doe", age: "22" },
{ username: "johndoe2", name: "John", surname: "Appleseed", age: "22" },
{ username: "johndoe2", name: "John", surname: "Appleseed", age: "22" },
]
```
If you select `scan` the upper rows will be fixed first, and matching
rows below will be updated accordingly. If you select `reverse-scan` it'll start fixing from bottom
and scan to the top, so the bottom rows will be assumed correct.
## Nested Objects?
Yes it supports nested objects as well.
```js
const { data, delta } = honst({
data: [
// ... some nested data
],
rules: {
'user.name': ["account.username"],
'user.surname': ["account.username"],
'profile.age': ["account.username"],
}
})
```
## Parameters
| Name | What's? | Type | Value
| ----------- | ------------------------------------------------------------------------- | ---------- | -------
| data | list to check | Array | `object[]`
| rules | determines which area the areas will be controlled according to. | Array | `object`
| pivot | the index of the data considered correct in the list. | Number or String | `number | "scan" | "reverse-scan"`
| delta | Used to get information about data corrected as a result of the operations | Boolean | `boolean` (Optional)
Result in `delta` :
| | |
| ----------------- | -------------- |
| **candidatePath** | modified path
| **falseValue** | modified incorrect value
| **candidateValue** | new value
| **pivot** | correct value index in data
| **candidateIndex** | modified value index in data
## Contribution
- Clone and edit the source as you wish.
- Please do not forget to add tests.
- Write a descriptive PR.
## License
This project uses MIT license.