alter-atlas
Version:
library for creating a nice difference log
234 lines (194 loc) • 5.2 kB
Markdown
Library for creating a nice difference log
- [Single Resolver](
- [Array Resolver](
- [Resolver Wrapper](
- [Nested Resolver](
- [Context](
Utility to check if the value has changed
- options (required);
-- name (required);
-- compareBy (optional);
-- transformForView (optional);
```typescript
SingleResolver({
name: 'Birthdate',
compareBy: (doc) => new Date(doc?.birthDate).toISOString(),
transformForView: (doc) => dayjs(doc?.birthDate).format('DD-MM-YYYY'),
});
```
The resolver returns the changed value or null
```json
{
"name": "Birthdate",
"old": "2002-12-18T21:00:00.000Z",
"new": "2024-11-04T21:00:00.000Z",
"oldForView": "19-12-2002",
"newForView": "05-11-2024",
"subChanges": []
}
```
Utility for comparing arrays
- change name (required);
- array path resolver (required);
- uniq by function to search for a unique item for comparison (required) (required)
- item name (required)
- resolvers for comparing the properties for each modified element (required)
```typescript
type CarType = { uniqId: number; carName: string; power: number };
ArrayResolver<CarType[], CarType>(
'Cars',
(value) => value ?? [], // array path
(value, index) => value?.uniqId, // uniq id resolver
(value) => value?.carName ?? 'unknown', // name resolver
[], // nested change resolvers
)(prev, current);
```
Resolver returns the value of the array change or null
```typescript
{
"name": "Cars",
"isArray": true,
"subChanges": [
{
"name": "Ford",
"isArrayItem": true,
"isNewArrayItem": false,
"isRemovedArrayItem": false,
"isUpdatedArrayItem": true,
"subChanges": [
{
"name": "power",
"old": 100,
"new": 150,
"subChanges": []
}
]
},
{
"name": "Toyota",
"isArrayItem": true,
"isNewArrayItem": false,
"isRemovedArrayItem": true,
"isUpdatedArrayItem": false,
"subChanges": [
{
"name": "power",
"old": 200,
"subChanges": []
}
]
}
]
}
```
Utility for comparing objects with many resolvers
- array of resolvers (required)
```typescript
type TestType = { field: string; array: CarType[] };
type CarType = { uniqId: number; carName: string; power: number };
ResolverWrapper<TestType>([
SingleResolver('field', (value) => value?.field),
ArrayResolver<TestType, CarType>(
'Cars',
(value) => value?.array ?? [],
(value, index) => value?.uniqId,
(value) => value?.carName ?? 'unknown',
[],
),
])(prev, current);
```
The return value is an array of changes
```json
[
{
"name": "field",
"old": "test1",
"new": "test2",
"subChanges": []
},
{
"name": "Cars",
"isArray": true,
"subChanges": [
{
"name": "Ford",
"isArrayItem": true,
"isNewArrayItem": false,
"isRemovedArrayItem": false,
"isUpdatedArrayItem": true,
"subChanges": [
{
"name": "power",
"old": 100,
"new": 150,
"subChanges": []
}
]
}
]
}
]
```
Utility for adding nested changes
- name of change (required)
- array of resolvers (required)
```typescript
NestedResolver<string>('test', [
SingleResolver('first-resolve', (value) => value),
SingleResolver('second-resolve', (value) => value),
])(prev, current);
```
Returns the nested structure of the changes
```json
{
"name": "test",
"subChanges": [
{
"name": "first-resolve",
"old": "prev",
"new": "current",
"subChanges": []
},
{
"name": "second-resolve",
"old": "prev",
"new": "current",
"subChanges": []
}
]
}
```
Utility for change the context of your resolvers
```typescript
type NestedObject = {
first: {
second: {
testField: string;
testField2: number;
};
};
};
NestedResolver<NestedObject>('', [
Context(
(value) => value?.first.second,
[
SingleResolver('testField', (value) => value?.testField),
SingleResolver('testField2', (value) => value?.testField2),
],
),
])(prev, current);
```