Skip to content

Commit cf57d17

Browse files
committed
chore: Add pretify-deep-diff utility with localization support
2 parents e77814d + 4dc060d commit cf57d17

File tree

12 files changed

+255
-1
lines changed

12 files changed

+255
-1
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,4 @@ dist
127127
.yarn/unplugged
128128
.yarn/build-state.yml
129129
.yarn/install-state.gz
130-
.pnp.*
130+
.pnp.*

README.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
2+
# pretify-deep-diff
3+
4+
A utility to prettify the results of `deep-diff` with emojis and localization support.
5+
6+
## Installation
7+
8+
To install the package, use npm:
9+
10+
```bash
11+
npm install pretify-deep-diff
12+
```
13+
14+
## Usage
15+
16+
Here's an example of how to use `pretify-deep-diff`:
17+
18+
```javascript
19+
const diff = require('deep-diff');
20+
const pretifyDeepDiff = require('pretify-deep-diff');
21+
22+
const lhs = {
23+
name: 'John',
24+
age: 30,
25+
pets: ['dog', 'cat'],
26+
address: {
27+
city: 'Chicago',
28+
street: 'Main St'
29+
}
30+
};
31+
32+
const rhs = {
33+
name: 'Jane',
34+
age: 31,
35+
pets: ['dog', 'parrot'],
36+
city: 'New York'
37+
};
38+
39+
const changes = diff(lhs, rhs);
40+
41+
console.log(pretifyDeepDiff(changes, { locale: 'ru' }));
42+
```
43+
44+
### Output
45+
46+
```text
47+
Добавлено:
48+
➕ Добавлено: city = "New York"
49+
50+
❌ Удалено:
51+
❌ Удалено: address
52+
53+
✏️ Изменено:
54+
✏️ Изменено: name с "John" на "Jane"
55+
✏️ Изменено: age с 30 на 31
56+
✏️ Изменено: pets.1 с "cat" на "parrot"
57+
```
58+
59+
## Options
60+
61+
- `locale`: Specify the locale (`en` or `ru`). Default is `en`.
62+
- `customTexts`: An object to customize text templates.
63+
64+
## Localization
65+
66+
The library supports localization through JSON files in the `locales` directory.

index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require('./lib/pretify-deep-diff');

lib/formatGroupedChanges.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const formatGroupedChanges = (groupedChanges, locale, customTexts) => {
2+
let result = '';
3+
if (groupedChanges.added.length) {
4+
result += `${customTexts.addedTitle || locale.addedTitle}\n` + groupedChanges.added.join('\n') + '\n\n';
5+
}
6+
if (groupedChanges.deleted.length) {
7+
result += `${customTexts.deletedTitle || locale.deletedTitle}\n` + groupedChanges.deleted.join('\n') + '\n\n';
8+
}
9+
if (groupedChanges.edited.length) {
10+
result += `${customTexts.editedTitle || locale.editedTitle}\n` + groupedChanges.edited.join('\n') + '\n\n';
11+
}
12+
if (groupedChanges.arrayChange.length) {
13+
result += `${customTexts.arrayChangeTitle || locale.arrayChangeTitle}\n` + groupedChanges.arrayChange.join('\n') + '\n\n';
14+
}
15+
16+
return result.trim();
17+
}
18+
19+
module.exports = formatGroupedChanges;

lib/formatPath.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function formatPath(path) {
2+
return path ? path.join('.') : '';
3+
}
4+
5+
module.exports = formatPath;

lib/formatText.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function formatText(template, variables) {
2+
return template.replace(/{(\w+)}/g, (_, key) => variables[key] || '');
3+
}
4+
5+
module.exports = formatText;

lib/pretify-deep-diff.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
const diff = require('deep-diff');
2+
const formatText = require('./formatText');
3+
const formatPath = require('./formatPath');
4+
const formatGroupedChanges = require('./formatGroupedChanges');
5+
const enLocale = require('../locales/en.json');
6+
const ruLocale = require('../locales/ru.json');
7+
8+
const locales = {
9+
en: enLocale,
10+
ru: ruLocale
11+
};
12+
13+
function pretifyDeepDiff(changes, options = {}) {
14+
const locale = locales[options.locale] || locales['en'];
15+
const customTexts = options.customTexts || {};
16+
17+
if (!changes || !Array.isArray(changes)) {
18+
return 'No changes detected.';
19+
}
20+
21+
const groupedChanges = {
22+
added: [],
23+
deleted: [],
24+
edited: [],
25+
arrayChange: []
26+
};
27+
28+
changes.forEach(change => {
29+
switch (change.kind) {
30+
case 'N':
31+
groupedChanges.added.push(formatText(customTexts.added || locale.added, {
32+
path: formatPath(change.path),
33+
value: JSON.stringify(change.rhs)
34+
}));
35+
break;
36+
case 'D':
37+
groupedChanges.deleted.push(formatText(customTexts.deleted || locale.deleted, {
38+
path: formatPath(change.path)
39+
}));
40+
break;
41+
case 'E':
42+
groupedChanges.edited.push(formatText(customTexts.edited || locale.edited, {
43+
path: formatPath(change.path),
44+
oldValue: JSON.stringify(change.lhs),
45+
newValue: JSON.stringify(change.rhs)
46+
}));
47+
break;
48+
case 'A':
49+
const arrayChangeText = pretifyDeepDiff([change.item], options);
50+
groupedChanges.arrayChange.push(formatText(customTexts.arrayChange || locale.arrayChange, {
51+
path: formatPath(change.path),
52+
index: change.index,
53+
item: arrayChangeText
54+
}));
55+
break;
56+
default:
57+
break;
58+
}
59+
});
60+
61+
return formatGroupedChanges(groupedChanges, locale, customTexts);
62+
}
63+
64+
module.exports = pretifyDeepDiff;

locales/en.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"added": "🆕 Added: {path} = {value}",
3+
"deleted": "🗑️ Deleted: {path}",
4+
"edited": "✏️ Edited: {path} from {oldValue} to {newValue}",
5+
"arrayChange": "🔄 Array change at {path} index {index}: {item}",
6+
"addedTitle": "🆕 Added:",
7+
"deletedTitle": "🗑️ Deleted:",
8+
"editedTitle": "✏️ Edited:",
9+
"arrayChangeTitle": "🔄 Array Changes:"
10+
}

locales/ru.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"added": "➕ Добавлено: {path} = {value}",
3+
"deleted": "❌ Удалено: {path}",
4+
"edited": "✏️ Изменено: {path} с {oldValue} на {newValue}",
5+
"arrayChange": "🔄 Изменение массива по пути {path} индекс {index}: {item}",
6+
"addedTitle": "➕ Добавлено:",
7+
"deletedTitle": "❌ Удалено:",
8+
"editedTitle": "✏️ Изменено:",
9+
"arrayChangeTitle": "🔄 Изменения в массиве:"
10+
}

package-lock.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)