@pocket-architect/core 0.1.26 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/Entity.d.ts +0 -9
- package/build/Entity.js +0 -23
- package/build/Entity.js.map +1 -1
- package/build/Entity.spec.js +14 -28
- package/build/Entity.spec.js.map +1 -1
- package/build/EventBus.spec.js +2 -22
- package/build/EventBus.spec.js.map +1 -1
- package/build/helpers/diff.d.ts +6 -11
- package/build/helpers/diff.js +21 -19
- package/build/helpers/diff.js.map +1 -1
- package/build/helpers/diff.spec.d.ts +1 -0
- package/build/helpers/diff.spec.js +46 -0
- package/build/helpers/diff.spec.js.map +1 -0
- package/build/index.d.ts +2 -1
- package/build/index.js +3 -1
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/Entity.spec.ts +13 -26
- package/src/Entity.ts +1 -29
- package/src/EventBus.spec.ts +2 -23
- package/src/helpers/diff.spec.ts +44 -0
- package/src/helpers/diff.ts +22 -33
- package/src/index.ts +6 -1
package/build/Entity.d.ts
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import { EntityId } from './EntityId';
|
|
2
|
-
import { DiffFormatterOptions, DiffViewModel } from "./helpers/diff";
|
|
3
2
|
export declare abstract class Entity<T, E, H extends EntityId<E>> {
|
|
4
3
|
protected readonly _id: H;
|
|
5
4
|
protected props: T;
|
|
6
5
|
protected _snapshot: string;
|
|
7
6
|
snapshot(): T;
|
|
8
|
-
/**
|
|
9
|
-
* Повертає diff у вигляді масиву обʼєктів (DiffViewModel),
|
|
10
|
-
* АЛЕ лише якщо Entity перевизначив toDiff().
|
|
11
|
-
*
|
|
12
|
-
* За замовчуванням toDiff() = null → snapshotDiff() = null.
|
|
13
|
-
*/
|
|
14
|
-
snapshotDiff(): DiffViewModel[] | null;
|
|
15
7
|
isDirty(): boolean;
|
|
16
8
|
protected constructor(props: T, id?: H | E);
|
|
17
9
|
equals(object?: Entity<T, E, H>): boolean;
|
|
@@ -19,5 +11,4 @@ export declare abstract class Entity<T, E, H extends EntityId<E>> {
|
|
|
19
11
|
toPrimitive(): T;
|
|
20
12
|
toJSON(): any;
|
|
21
13
|
toSnapshot(): any;
|
|
22
|
-
toDiff(): DiffFormatterOptions | null;
|
|
23
14
|
}
|
package/build/Entity.js
CHANGED
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Entity = void 0;
|
|
4
4
|
var EntityId_1 = require("./EntityId");
|
|
5
5
|
var helpers_1 = require("./helpers");
|
|
6
|
-
var diff_1 = require("./helpers/diff");
|
|
7
6
|
var isEntity = function (v) {
|
|
8
7
|
return v instanceof Entity;
|
|
9
8
|
};
|
|
@@ -25,25 +24,6 @@ var Entity = /** @class */ (function () {
|
|
|
25
24
|
Object.freeze(copy);
|
|
26
25
|
return copy;
|
|
27
26
|
};
|
|
28
|
-
/**
|
|
29
|
-
* Повертає diff у вигляді масиву обʼєктів (DiffViewModel),
|
|
30
|
-
* АЛЕ лише якщо Entity перевизначив toDiff().
|
|
31
|
-
*
|
|
32
|
-
* За замовчуванням toDiff() = null → snapshotDiff() = null.
|
|
33
|
-
*/
|
|
34
|
-
Entity.prototype.snapshotDiff = function () {
|
|
35
|
-
if (!this._snapshot)
|
|
36
|
-
return null;
|
|
37
|
-
var diffOptions = this.toDiff();
|
|
38
|
-
if (!diffOptions)
|
|
39
|
-
return null;
|
|
40
|
-
var beforeObj = JSON.parse(this._snapshot);
|
|
41
|
-
var afterObj = (0, helpers_1.createSnapshot)(this.props);
|
|
42
|
-
var diffs = (0, diff_1.diffObjects)(beforeObj, afterObj);
|
|
43
|
-
if (diffs.length === 0)
|
|
44
|
-
return [];
|
|
45
|
-
return (0, diff_1.buildDiffViewModel)(diffs, diffOptions);
|
|
46
|
-
};
|
|
47
27
|
Entity.prototype.isDirty = function () {
|
|
48
28
|
if (!this._snapshot) {
|
|
49
29
|
return false;
|
|
@@ -80,9 +60,6 @@ var Entity = /** @class */ (function () {
|
|
|
80
60
|
Entity.prototype.toSnapshot = function () {
|
|
81
61
|
return this.toPrimitive();
|
|
82
62
|
};
|
|
83
|
-
Entity.prototype.toDiff = function () {
|
|
84
|
-
return null;
|
|
85
|
-
};
|
|
86
63
|
return Entity;
|
|
87
64
|
}());
|
|
88
65
|
exports.Entity = Entity;
|
package/build/Entity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AACtC,qCAAyC;
|
|
1
|
+
{"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AACtC,qCAAyC;AAEzC,IAAM,QAAQ,GAAG,UAA8B,CAAkB;IAC/D,OAAO,CAAC,YAAY,MAAM,CAAA;AAC5B,CAAC,CAAA;AAED;IAsBE,gBAAsB,KAAQ,EAAE,EAAQ;QACtC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,GAAG,GAAM,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,mBAAQ,CAAI,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,GAAM,CAAC,IAAI,mBAAQ,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAxBD,yBAAQ,GAAR;QACE,yDAAyD;QACzD,IAAM,OAAO,GAAG,IAAA,wBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEzC,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAM,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wBAAO,GAAP;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,IAAA,wBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAWM,uBAAM,GAAb,UAAc,MAAwB;QACpC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,sBAAI,sBAAE;aAAN;YACE,OAAO,IAAI,CAAC,GAAG,CAAA;QACjB,CAAC;;;OAAA;IAED,4BAAW,GAAX;QACE,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,8DAA8D;IAC9D,uBAAM,GAAN;QACE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,8DAA8D;IAC9D,2BAAU,GAAV;QACE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IACH,aAAC;AAAD,CAAC,AAhED,IAgEC;AAhEqB,wBAAM"}
|
package/build/Entity.spec.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var tslib_1 = require("tslib");
|
|
4
4
|
var Entity_1 = require("./Entity");
|
|
5
5
|
var EntityId_1 = require("./EntityId");
|
|
6
|
+
var diff_1 = require("./helpers/diff");
|
|
6
7
|
var TestEntity = /** @class */ (function (_super) {
|
|
7
8
|
tslib_1.__extends(TestEntity, _super);
|
|
8
9
|
function TestEntity() {
|
|
@@ -28,29 +29,6 @@ var TestEntity = /** @class */ (function (_super) {
|
|
|
28
29
|
TestEntity.prototype.setFirstAmount = function (amount) {
|
|
29
30
|
this.props.parts[0].amount = amount;
|
|
30
31
|
};
|
|
31
|
-
TestEntity.prototype.toDiff = function () {
|
|
32
|
-
return {
|
|
33
|
-
resolveLabel: function (_a) {
|
|
34
|
-
var key = _a.key, index = _a.index, path = _a.path;
|
|
35
|
-
if (key === 'createdAt')
|
|
36
|
-
return null; // ignore
|
|
37
|
-
if (key === 'amount' && index !== null)
|
|
38
|
-
return "\u0426\u0456\u043D\u0430 (\u043F\u043E\u0437\u0438\u0446\u0456\u044F ".concat(index + 1, ")");
|
|
39
|
-
if (path === 'name')
|
|
40
|
-
return 'Імʼя';
|
|
41
|
-
return undefined;
|
|
42
|
-
},
|
|
43
|
-
formatValue: function (value, _a) {
|
|
44
|
-
var key = _a.key;
|
|
45
|
-
if (value instanceof EntityId_1.EntityId) {
|
|
46
|
-
return value.toHash();
|
|
47
|
-
}
|
|
48
|
-
if (key === 'amount' && typeof value === 'number')
|
|
49
|
-
return "".concat(value.toFixed(2), " \u0433\u0440\u043D");
|
|
50
|
-
return String(value);
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
};
|
|
54
32
|
return TestEntity;
|
|
55
33
|
}(Entity_1.Entity));
|
|
56
34
|
var TestEntity2 = /** @class */ (function (_super) {
|
|
@@ -107,7 +85,7 @@ describe('Entity', function () {
|
|
|
107
85
|
});
|
|
108
86
|
}); });
|
|
109
87
|
test('snapshot', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
110
|
-
var snapshot;
|
|
88
|
+
var snapshot, beforeSnapshot, formatter;
|
|
111
89
|
return tslib_1.__generator(this, function (_a) {
|
|
112
90
|
snapshot = entity.snapshot();
|
|
113
91
|
expect(snapshot).toEqual({
|
|
@@ -130,12 +108,22 @@ describe('Entity', function () {
|
|
|
130
108
|
expect(function () {
|
|
131
109
|
snapshot.name = 'changed';
|
|
132
110
|
}).toThrow();
|
|
111
|
+
beforeSnapshot = entity.snapshot();
|
|
112
|
+
formatter = function (value, _a) {
|
|
113
|
+
var key = _a.key;
|
|
114
|
+
if (value instanceof EntityId_1.EntityId) {
|
|
115
|
+
return value.toHash();
|
|
116
|
+
}
|
|
117
|
+
if (key === 'amount' && typeof value === 'number')
|
|
118
|
+
return "".concat(value.toFixed(2), " \u0433\u0440\u043D");
|
|
119
|
+
return String(value);
|
|
120
|
+
};
|
|
133
121
|
expect(entity.isDirty()).toEqual(false);
|
|
134
|
-
expect(entity.
|
|
122
|
+
expect((0, diff_1.getDiff)(beforeSnapshot, entity.snapshot(), formatter)).toEqual(null);
|
|
135
123
|
entity.name = 'test changed';
|
|
136
124
|
entity.setFirstAmount(200);
|
|
137
125
|
expect(entity.isDirty()).toEqual(true);
|
|
138
|
-
expect(entity.
|
|
126
|
+
expect((0, diff_1.getDiff)(beforeSnapshot, entity.snapshot(), formatter)).toEqual([
|
|
139
127
|
{
|
|
140
128
|
"after": "test changed",
|
|
141
129
|
"afterRaw": "test changed",
|
|
@@ -143,7 +131,6 @@ describe('Entity', function () {
|
|
|
143
131
|
"beforeRaw": "test",
|
|
144
132
|
"index": null,
|
|
145
133
|
"kind": "changed",
|
|
146
|
-
"label": "Імʼя",
|
|
147
134
|
"path": "name"
|
|
148
135
|
},
|
|
149
136
|
{
|
|
@@ -153,7 +140,6 @@ describe('Entity', function () {
|
|
|
153
140
|
"beforeRaw": 1000,
|
|
154
141
|
"index": 0,
|
|
155
142
|
"kind": "changed",
|
|
156
|
-
"label": "Ціна (позиція 1)",
|
|
157
143
|
"path": "parts[0].amount"
|
|
158
144
|
}
|
|
159
145
|
]);
|
package/build/Entity.spec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAClC,uCAAsC;
|
|
1
|
+
{"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":"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"}
|
package/build/EventBus.spec.js
CHANGED
|
@@ -88,17 +88,6 @@ describe('EventBus', function () {
|
|
|
88
88
|
enumerable: false,
|
|
89
89
|
configurable: true
|
|
90
90
|
});
|
|
91
|
-
User.prototype.toDiff = function () {
|
|
92
|
-
return {
|
|
93
|
-
resolveLabel: function (_a) {
|
|
94
|
-
var key = _a.key;
|
|
95
|
-
return key;
|
|
96
|
-
},
|
|
97
|
-
formatValue: function (value) {
|
|
98
|
-
return value === null || value === void 0 ? void 0 : value.toString();
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
};
|
|
102
91
|
return User;
|
|
103
92
|
}(Entity_1.Entity));
|
|
104
93
|
UserCreatedEvent = /** @class */ (function (_super) {
|
|
@@ -130,16 +119,7 @@ describe('EventBus', function () {
|
|
|
130
119
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
131
120
|
return tslib_1.__generator(this, function (_a) {
|
|
132
121
|
expect(domainEvent.diff).toEqual([
|
|
133
|
-
{
|
|
134
|
-
kind: 'changed',
|
|
135
|
-
label: 'username',
|
|
136
|
-
path: 'username',
|
|
137
|
-
index: null,
|
|
138
|
-
beforeRaw: 'john_doe',
|
|
139
|
-
afterRaw: 'john_doe_updated',
|
|
140
|
-
before: 'john_doe',
|
|
141
|
-
after: 'john_doe_updated'
|
|
142
|
-
}
|
|
122
|
+
{ test: 1 }
|
|
143
123
|
]);
|
|
144
124
|
return [2 /*return*/];
|
|
145
125
|
});
|
|
@@ -159,7 +139,7 @@ describe('EventBus', function () {
|
|
|
159
139
|
expect(user.isDirty()).toBeTruthy();
|
|
160
140
|
// Перевіряємо, чи є зміни
|
|
161
141
|
if (user.isDirty()) {
|
|
162
|
-
diff =
|
|
142
|
+
diff = [{ test: 1 }];
|
|
163
143
|
if (diff) {
|
|
164
144
|
event = new UserCreatedEvent({ diff: diff });
|
|
165
145
|
// записуємо подію в чергу (не publish). Бо якщо в циклі може бути багато подій і їх треба назбирати, а потім виконати, тому збираємо через push
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventBus.spec.js","sourceRoot":"","sources":["../src/EventBus.spec.ts"],"names":[],"mappings":";;;AAAA,gEAA6D;AAE7D,6CAA4D;AAC5D,uCAAoC;AACpC,mCAAgC;
|
|
1
|
+
{"version":3,"file":"EventBus.spec.js","sourceRoot":"","sources":["../src/EventBus.spec.ts"],"names":[],"mappings":"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"}
|
package/build/helpers/diff.d.ts
CHANGED
|
@@ -20,18 +20,9 @@ export interface LabelContext {
|
|
|
20
20
|
segments: PathSegment[];
|
|
21
21
|
entry: DiffEntry;
|
|
22
22
|
}
|
|
23
|
-
export
|
|
24
|
-
/**
|
|
25
|
-
* - string → label (людська назва поля)
|
|
26
|
-
* - null → ignore
|
|
27
|
-
* - undefined → fallback на path
|
|
28
|
-
*/
|
|
29
|
-
resolveLabel?: (ctx: LabelContext) => string | null | undefined;
|
|
30
|
-
formatValue?: (value: unknown, ctx: LabelContext) => string;
|
|
31
|
-
}
|
|
23
|
+
export type DiffFormatter = (value: unknown, ctx: LabelContext) => string;
|
|
32
24
|
export interface DiffViewModel {
|
|
33
25
|
kind: DiffKind;
|
|
34
|
-
label: string;
|
|
35
26
|
path: string;
|
|
36
27
|
index: number | null;
|
|
37
28
|
beforeRaw?: unknown;
|
|
@@ -40,4 +31,8 @@ export interface DiffViewModel {
|
|
|
40
31
|
after?: string;
|
|
41
32
|
}
|
|
42
33
|
export declare function diffObjects(before: unknown, after: unknown): DiffEntry[];
|
|
43
|
-
export declare function buildDiffViewModel(diffs: DiffEntry[],
|
|
34
|
+
export declare function buildDiffViewModel(diffs: DiffEntry[], formatValue?: DiffFormatter): DiffViewModel[];
|
|
35
|
+
/**
|
|
36
|
+
* Повертає diff у вигляді масиву обʼєктів (DiffViewModel),
|
|
37
|
+
*/
|
|
38
|
+
export declare function getDiff(beforeObj: any, afterObj: any, formatter?: DiffFormatter): DiffViewModel[] | null;
|
package/build/helpers/diff.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildDiffViewModel = exports.diffObjects = void 0;
|
|
3
|
+
exports.getDiff = exports.buildDiffViewModel = exports.diffObjects = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
+
var EntityId_1 = require("../EntityId");
|
|
5
6
|
function diffObjects(before, after) {
|
|
6
7
|
var diffs = [];
|
|
7
8
|
walk(before, after, [], diffs);
|
|
@@ -103,30 +104,21 @@ function buildLabelContext(entry) {
|
|
|
103
104
|
entry: entry,
|
|
104
105
|
};
|
|
105
106
|
}
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
108
|
function defaultStringify(value) {
|
|
107
|
-
if (
|
|
108
|
-
return
|
|
109
|
-
|
|
110
|
-
return value ? 'true' : 'false';
|
|
111
|
-
if (value === null)
|
|
112
|
-
return 'null';
|
|
113
|
-
if (typeof value === 'object')
|
|
114
|
-
return JSON.stringify(value);
|
|
115
|
-
return String(value);
|
|
109
|
+
if (value instanceof EntityId_1.EntityId)
|
|
110
|
+
return value.toJSON();
|
|
111
|
+
return value;
|
|
116
112
|
}
|
|
117
|
-
function buildDiffViewModel(diffs,
|
|
118
|
-
var
|
|
113
|
+
function buildDiffViewModel(diffs, formatValue) {
|
|
114
|
+
var formatter = formatValue || defaultStringify;
|
|
119
115
|
var seen = new Set();
|
|
120
116
|
var result = [];
|
|
121
117
|
for (var _i = 0, diffs_1 = diffs; _i < diffs_1.length; _i++) {
|
|
122
118
|
var entry = diffs_1[_i];
|
|
123
119
|
var ctx = buildLabelContext(entry);
|
|
124
|
-
var
|
|
125
|
-
|
|
126
|
-
continue;
|
|
127
|
-
var label = resolvedLabel !== null && resolvedLabel !== void 0 ? resolvedLabel : entry.path;
|
|
128
|
-
var beforeFormatted = entry.before !== undefined ? formatValue(entry.before, ctx) : undefined;
|
|
129
|
-
var afterFormatted = entry.after !== undefined ? formatValue(entry.after, ctx) : undefined;
|
|
120
|
+
var beforeFormatted = entry.before !== undefined ? formatter(entry.before, ctx) : undefined;
|
|
121
|
+
var afterFormatted = entry.after !== undefined ? formatter(entry.after, ctx) : undefined;
|
|
130
122
|
// якщо форматовано однаково — не зміна
|
|
131
123
|
if (entry.kind === 'changed' && beforeFormatted === afterFormatted) {
|
|
132
124
|
continue;
|
|
@@ -139,7 +131,6 @@ function buildDiffViewModel(diffs, options) {
|
|
|
139
131
|
seen.add(dedupeKey);
|
|
140
132
|
result.push({
|
|
141
133
|
kind: entry.kind,
|
|
142
|
-
label: label,
|
|
143
134
|
path: entry.path,
|
|
144
135
|
index: ctx.index,
|
|
145
136
|
beforeRaw: entry.before,
|
|
@@ -151,4 +142,15 @@ function buildDiffViewModel(diffs, options) {
|
|
|
151
142
|
return result;
|
|
152
143
|
}
|
|
153
144
|
exports.buildDiffViewModel = buildDiffViewModel;
|
|
145
|
+
/**
|
|
146
|
+
* Повертає diff у вигляді масиву обʼєктів (DiffViewModel),
|
|
147
|
+
*/
|
|
148
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
149
|
+
function getDiff(beforeObj, afterObj, formatter) {
|
|
150
|
+
var diffs = diffObjects(beforeObj, afterObj);
|
|
151
|
+
if (diffs.length === 0)
|
|
152
|
+
return null;
|
|
153
|
+
return buildDiffViewModel(diffs, formatter);
|
|
154
|
+
}
|
|
155
|
+
exports.getDiff = getDiff;
|
|
154
156
|
//# sourceMappingURL=diff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/helpers/diff.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/helpers/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var diff_1 = require("./diff");
|
|
4
|
+
test('getDiff', function () {
|
|
5
|
+
expect((0, diff_1.getDiff)({ test: '1' }, { test: '2' })).toEqual([
|
|
6
|
+
{
|
|
7
|
+
"after": "2",
|
|
8
|
+
"afterRaw": "2",
|
|
9
|
+
"before": "1",
|
|
10
|
+
"beforeRaw": "1",
|
|
11
|
+
"index": null,
|
|
12
|
+
"kind": "changed",
|
|
13
|
+
"path": "test"
|
|
14
|
+
}
|
|
15
|
+
]);
|
|
16
|
+
expect((0, diff_1.getDiff)({ test: [1] }, { test: [2] })).toEqual([
|
|
17
|
+
{
|
|
18
|
+
"after": 2,
|
|
19
|
+
"afterRaw": 2,
|
|
20
|
+
"before": 1,
|
|
21
|
+
"beforeRaw": 1,
|
|
22
|
+
"index": 0,
|
|
23
|
+
"kind": "changed",
|
|
24
|
+
"path": "test[0]"
|
|
25
|
+
}
|
|
26
|
+
]);
|
|
27
|
+
expect((0, diff_1.getDiff)({ test: [] }, { test: [2] })).toEqual([
|
|
28
|
+
{
|
|
29
|
+
"after": 2,
|
|
30
|
+
"afterRaw": 2,
|
|
31
|
+
"index": 0,
|
|
32
|
+
"kind": "changed",
|
|
33
|
+
"path": "test[0]"
|
|
34
|
+
}
|
|
35
|
+
]);
|
|
36
|
+
expect((0, diff_1.getDiff)({ test: [1] }, { test: [] })).toEqual([
|
|
37
|
+
{
|
|
38
|
+
"before": 1,
|
|
39
|
+
"beforeRaw": 1,
|
|
40
|
+
"index": 0,
|
|
41
|
+
"kind": "changed",
|
|
42
|
+
"path": "test[0]"
|
|
43
|
+
}
|
|
44
|
+
]);
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=diff.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.spec.js","sourceRoot":"","sources":["../../src/helpers/diff.spec.ts"],"names":[],"mappings":";;AAAA,+BAA+B;AAE/B,IAAI,CAAC,SAAS,EAAE;IACd,MAAM,CAAC,IAAA,cAAO,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpD;YACE,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,GAAG;YACb,WAAW,EAAE,GAAG;YAChB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,MAAM;SACf;KACF,CAAC,CAAC;IACH,MAAM,CAAC,IAAA,cAAO,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpD;YACE,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB;KACF,CAAC,CAAC;IACH,MAAM,CAAC,IAAA,cAAO,EAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACnD;YACE,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB;KACF,CAAC,CAAC;IACH,MAAM,CAAC,IAAA,cAAO,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACnD;YACE,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -10,4 +10,5 @@ import { Eventable } from './mixins/Eventable';
|
|
|
10
10
|
import { Application } from './application/Application';
|
|
11
11
|
import { ApplicationModule } from './application/ApplicationModule';
|
|
12
12
|
import { bootstrap } from './bootstrap';
|
|
13
|
-
|
|
13
|
+
import { getDiff, DiffFormatter, DiffViewModel } from './helpers/diff';
|
|
14
|
+
export { Entity, EntityId, ValueObject, AggregateRoot, HashError, DomainEvent, DomainEventSubscriber, EventBus, Eventable, Application, ApplicationModule, bootstrap, DiffViewModel, DiffFormatter, getDiff };
|
package/build/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.bootstrap = exports.ApplicationModule = exports.Application = exports.Eventable = exports.DomainEvent = exports.HashError = exports.AggregateRoot = exports.ValueObject = exports.EntityId = exports.Entity = void 0;
|
|
3
|
+
exports.getDiff = exports.bootstrap = exports.ApplicationModule = exports.Application = exports.Eventable = exports.DomainEvent = exports.HashError = exports.AggregateRoot = exports.ValueObject = exports.EntityId = exports.Entity = void 0;
|
|
4
4
|
var Entity_1 = require("./Entity");
|
|
5
5
|
Object.defineProperty(exports, "Entity", { enumerable: true, get: function () { return Entity_1.Entity; } });
|
|
6
6
|
var EntityId_1 = require("./EntityId");
|
|
@@ -21,4 +21,6 @@ var ApplicationModule_1 = require("./application/ApplicationModule");
|
|
|
21
21
|
Object.defineProperty(exports, "ApplicationModule", { enumerable: true, get: function () { return ApplicationModule_1.ApplicationModule; } });
|
|
22
22
|
var bootstrap_1 = require("./bootstrap");
|
|
23
23
|
Object.defineProperty(exports, "bootstrap", { enumerable: true, get: function () { return bootstrap_1.bootstrap; } });
|
|
24
|
+
var diff_1 = require("./helpers/diff");
|
|
25
|
+
Object.defineProperty(exports, "getDiff", { enumerable: true, get: function () { return diff_1.getDiff; } });
|
|
24
26
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAehC,uFAfO,eAAM,OAeP;AAdR,uCAAsC;AAepC,yFAfO,mBAAQ,OAeP;AAdV,6CAA4C;AAe1C,4FAfO,yBAAW,OAeP;AAdb,iDAAgD;AAe9C,8FAfO,6BAAa,OAeP;AAdf,+CAA8C;AAe5C,0FAfO,qBAAS,OAeP;AAdX,6CAA4C;AAe1C,4FAfO,yBAAW,OAeP;AAZb,gDAA+C;AAe7C,0FAfO,qBAAS,OAeP;AAdX,yDAAwD;AAgBtD,4FAhBO,yBAAW,OAgBP;AAfb,qEAAoE;AAgBlE,kGAhBO,qCAAiB,OAgBP;AAfnB,yCAAwC;AAiBtC,0FAjBO,qBAAS,OAiBP;AAhBX,uCAAuE;AAoBrE,wFApBO,cAAO,OAoBP"}
|
package/package.json
CHANGED
package/src/Entity.spec.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Entity } from './Entity';
|
|
2
2
|
import { EntityId } from './EntityId';
|
|
3
|
-
import {
|
|
3
|
+
import {getDiff} from "./helpers/diff";
|
|
4
4
|
|
|
5
5
|
interface TestProps {
|
|
6
6
|
name: string;
|
|
@@ -31,26 +31,6 @@ class TestEntity extends Entity<TestProps, string, EntityId<string>> {
|
|
|
31
31
|
setFirstAmount(amount:number):void {
|
|
32
32
|
this.props.parts[0].amount = amount;
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
toDiff(): DiffFormatterOptions | null {
|
|
36
|
-
return {
|
|
37
|
-
resolveLabel({ key, index, path }) {
|
|
38
|
-
if (key === 'createdAt') return null; // ignore
|
|
39
|
-
|
|
40
|
-
if (key === 'amount' && index !== null) return `Ціна (позиція ${index + 1})`;
|
|
41
|
-
if (path === 'name') return 'Імʼя';
|
|
42
|
-
|
|
43
|
-
return undefined;
|
|
44
|
-
},
|
|
45
|
-
formatValue(value, { key }) {
|
|
46
|
-
if (value instanceof EntityId) {
|
|
47
|
-
return value.toHash();
|
|
48
|
-
}
|
|
49
|
-
if (key === 'amount' && typeof value === 'number') return `${value.toFixed(2)} грн`;
|
|
50
|
-
return String(value);
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
34
|
}
|
|
55
35
|
class TestEntity2 extends Entity<TestProps2, string, EntityId<string>> {
|
|
56
36
|
static create(props: TestProps2, id?:EntityId<string>|string): TestEntity2 {
|
|
@@ -124,13 +104,22 @@ describe('Entity', () => {
|
|
|
124
104
|
|
|
125
105
|
expect(() => {
|
|
126
106
|
snapshot.name = 'changed';
|
|
127
|
-
}).toThrow()
|
|
107
|
+
}).toThrow();
|
|
108
|
+
const beforeSnapshot = entity.snapshot();
|
|
109
|
+
const formatter = (value, { key }) => {
|
|
110
|
+
if (value instanceof EntityId) {
|
|
111
|
+
return value.toHash();
|
|
112
|
+
}
|
|
113
|
+
if (key === 'amount' && typeof value === 'number') return `${value.toFixed(2)} грн`;
|
|
114
|
+
return String(value);
|
|
115
|
+
};
|
|
116
|
+
|
|
128
117
|
expect(entity.isDirty()).toEqual(false);
|
|
129
|
-
expect(entity.
|
|
118
|
+
expect(getDiff(beforeSnapshot, entity.snapshot(), formatter)).toEqual(null);
|
|
130
119
|
entity.name = 'test changed';
|
|
131
120
|
entity.setFirstAmount(200);
|
|
132
121
|
expect(entity.isDirty()).toEqual(true);
|
|
133
|
-
expect(entity.
|
|
122
|
+
expect(getDiff(beforeSnapshot, entity.snapshot(), formatter)).toEqual([
|
|
134
123
|
{
|
|
135
124
|
"after": "test changed",
|
|
136
125
|
"afterRaw": "test changed",
|
|
@@ -138,7 +127,6 @@ describe('Entity', () => {
|
|
|
138
127
|
"beforeRaw": "test",
|
|
139
128
|
"index": null,
|
|
140
129
|
"kind": "changed",
|
|
141
|
-
"label": "Імʼя",
|
|
142
130
|
"path": "name"
|
|
143
131
|
},
|
|
144
132
|
{
|
|
@@ -148,7 +136,6 @@ describe('Entity', () => {
|
|
|
148
136
|
"beforeRaw": 1000,
|
|
149
137
|
"index": 0,
|
|
150
138
|
"kind": "changed",
|
|
151
|
-
"label": "Ціна (позиція 1)",
|
|
152
139
|
"path": "parts[0].amount"
|
|
153
140
|
}
|
|
154
141
|
]);
|
package/src/Entity.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { EntityId } from './EntityId';
|
|
2
2
|
import {createSnapshot} from "./helpers";
|
|
3
|
-
import {buildDiffViewModel, DiffFormatterOptions, diffObjects, DiffViewModel} from "./helpers/diff";
|
|
4
3
|
|
|
5
4
|
const isEntity = <T, E, M extends EntityId<E>>(v: Entity<T, E, M>): v is Entity<T, E, M> => {
|
|
6
5
|
return v instanceof Entity
|
|
@@ -11,9 +10,8 @@ export abstract class Entity<T, E, H extends EntityId<E>> {
|
|
|
11
10
|
protected props: T;
|
|
12
11
|
protected _snapshot: string;
|
|
13
12
|
|
|
14
|
-
|
|
15
13
|
snapshot(): T {
|
|
16
|
-
// важливо: snapshot має бути стабільним (createSnapshot)
|
|
14
|
+
// важливо: snapshot має бути стабільним (createSnapshot)
|
|
17
15
|
const snapObj = createSnapshot(this.props);
|
|
18
16
|
this._snapshot = JSON.stringify(snapObj);
|
|
19
17
|
|
|
@@ -22,28 +20,6 @@ export abstract class Entity<T, E, H extends EntityId<E>> {
|
|
|
22
20
|
return copy;
|
|
23
21
|
}
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Повертає diff у вигляді масиву обʼєктів (DiffViewModel),
|
|
28
|
-
* АЛЕ лише якщо Entity перевизначив toDiff().
|
|
29
|
-
*
|
|
30
|
-
* За замовчуванням toDiff() = null → snapshotDiff() = null.
|
|
31
|
-
*/
|
|
32
|
-
snapshotDiff(): DiffViewModel[] | null {
|
|
33
|
-
if (!this._snapshot) return null;
|
|
34
|
-
|
|
35
|
-
const diffOptions = this.toDiff();
|
|
36
|
-
if (!diffOptions) return null;
|
|
37
|
-
|
|
38
|
-
const beforeObj = JSON.parse(this._snapshot) as unknown;
|
|
39
|
-
const afterObj = createSnapshot(this.props);
|
|
40
|
-
|
|
41
|
-
const diffs = diffObjects(beforeObj, afterObj);
|
|
42
|
-
if (diffs.length === 0) return [];
|
|
43
|
-
|
|
44
|
-
return buildDiffViewModel(diffs, diffOptions);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
23
|
isDirty(): boolean {
|
|
48
24
|
if (!this._snapshot) {
|
|
49
25
|
return false;
|
|
@@ -93,8 +69,4 @@ export abstract class Entity<T, E, H extends EntityId<E>> {
|
|
|
93
69
|
toSnapshot(): any {
|
|
94
70
|
return this.toPrimitive();
|
|
95
71
|
}
|
|
96
|
-
|
|
97
|
-
toDiff(): DiffFormatterOptions | null {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
72
|
}
|
package/src/EventBus.spec.ts
CHANGED
|
@@ -3,7 +3,6 @@ import {DomainEventSubscriber} from "./DomainEventSubscriber";
|
|
|
3
3
|
import {DomainEvent, DomainEventClass} from "./DomainEvent";
|
|
4
4
|
import {EntityId} from "./EntityId";
|
|
5
5
|
import {Entity} from "./Entity";
|
|
6
|
-
import {DiffFormatterOptions} from "./helpers/diff";
|
|
7
6
|
|
|
8
7
|
describe('EventBus', () => {
|
|
9
8
|
class NewUserCreated extends DomainEvent<{ username: string }> {
|
|
@@ -58,17 +57,6 @@ describe('EventBus', () => {
|
|
|
58
57
|
get username(): string {
|
|
59
58
|
return this.props.username;
|
|
60
59
|
}
|
|
61
|
-
|
|
62
|
-
toDiff(): DiffFormatterOptions | null {
|
|
63
|
-
return {
|
|
64
|
-
resolveLabel({ key }) {
|
|
65
|
-
return key;
|
|
66
|
-
},
|
|
67
|
-
formatValue(value) {
|
|
68
|
-
return value?.toString();
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
60
|
}
|
|
73
61
|
|
|
74
62
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -89,16 +77,7 @@ describe('EventBus', () => {
|
|
|
89
77
|
// Реалізуємо логіку обробки подій
|
|
90
78
|
async on(domainEvent: UserCreatedEvent) {
|
|
91
79
|
expect(domainEvent.diff).toEqual([
|
|
92
|
-
{
|
|
93
|
-
kind: 'changed',
|
|
94
|
-
label: 'username',
|
|
95
|
-
path: 'username',
|
|
96
|
-
index: null,
|
|
97
|
-
beforeRaw: 'john_doe',
|
|
98
|
-
afterRaw: 'john_doe_updated',
|
|
99
|
-
before: 'john_doe',
|
|
100
|
-
after: 'john_doe_updated'
|
|
101
|
-
}
|
|
80
|
+
{ test: 1 }
|
|
102
81
|
]);
|
|
103
82
|
}
|
|
104
83
|
}
|
|
@@ -118,7 +97,7 @@ describe('EventBus', () => {
|
|
|
118
97
|
expect(user.isDirty()).toBeTruthy();
|
|
119
98
|
// Перевіряємо, чи є зміни
|
|
120
99
|
if (user.isDirty()) {
|
|
121
|
-
const diff =
|
|
100
|
+
const diff = [{ test: 1 }];
|
|
122
101
|
if (diff) {
|
|
123
102
|
event = new UserCreatedEvent({ diff });
|
|
124
103
|
// записуємо подію в чергу (не publish). Бо якщо в циклі може бути багато подій і їх треба назбирати, а потім виконати, тому збираємо через push
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {getDiff} from "./diff";
|
|
2
|
+
|
|
3
|
+
test('getDiff', () => {
|
|
4
|
+
expect(getDiff({ test: '1' }, { test: '2' })).toEqual([
|
|
5
|
+
{
|
|
6
|
+
"after": "2",
|
|
7
|
+
"afterRaw": "2",
|
|
8
|
+
"before": "1",
|
|
9
|
+
"beforeRaw": "1",
|
|
10
|
+
"index": null,
|
|
11
|
+
"kind": "changed",
|
|
12
|
+
"path": "test"
|
|
13
|
+
}
|
|
14
|
+
]);
|
|
15
|
+
expect(getDiff({ test: [1] }, { test: [2] })).toEqual([
|
|
16
|
+
{
|
|
17
|
+
"after": 2,
|
|
18
|
+
"afterRaw": 2,
|
|
19
|
+
"before": 1,
|
|
20
|
+
"beforeRaw": 1,
|
|
21
|
+
"index": 0,
|
|
22
|
+
"kind": "changed",
|
|
23
|
+
"path": "test[0]"
|
|
24
|
+
}
|
|
25
|
+
]);
|
|
26
|
+
expect(getDiff({ test: [] }, { test: [2] })).toEqual([
|
|
27
|
+
{
|
|
28
|
+
"after": 2,
|
|
29
|
+
"afterRaw": 2,
|
|
30
|
+
"index": 0,
|
|
31
|
+
"kind": "changed",
|
|
32
|
+
"path": "test[0]"
|
|
33
|
+
}
|
|
34
|
+
]);
|
|
35
|
+
expect(getDiff({ test: [1] }, { test: [] })).toEqual([
|
|
36
|
+
{
|
|
37
|
+
"before": 1,
|
|
38
|
+
"beforeRaw": 1,
|
|
39
|
+
"index": 0,
|
|
40
|
+
"kind": "changed",
|
|
41
|
+
"path": "test[0]"
|
|
42
|
+
}
|
|
43
|
+
]);
|
|
44
|
+
});
|
package/src/helpers/diff.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import {EntityId} from "../EntityId";
|
|
2
|
+
|
|
1
3
|
export type DiffKind = 'added' | 'removed' | 'changed';
|
|
2
4
|
|
|
3
5
|
export type PathSegment =
|
|
@@ -20,20 +22,10 @@ export interface LabelContext {
|
|
|
20
22
|
entry: DiffEntry;
|
|
21
23
|
}
|
|
22
24
|
|
|
23
|
-
export
|
|
24
|
-
/**
|
|
25
|
-
* - string → label (людська назва поля)
|
|
26
|
-
* - null → ignore
|
|
27
|
-
* - undefined → fallback на path
|
|
28
|
-
*/
|
|
29
|
-
resolveLabel?: (ctx: LabelContext) => string | null | undefined;
|
|
30
|
-
|
|
31
|
-
formatValue?: (value: unknown, ctx: LabelContext) => string;
|
|
32
|
-
}
|
|
25
|
+
export type DiffFormatter = (value: unknown, ctx: LabelContext) => string;
|
|
33
26
|
|
|
34
27
|
export interface DiffViewModel {
|
|
35
28
|
kind: DiffKind;
|
|
36
|
-
label: string;
|
|
37
29
|
path: string;
|
|
38
30
|
index: number | null;
|
|
39
31
|
|
|
@@ -160,19 +152,14 @@ function buildLabelContext(entry: DiffEntry): LabelContext {
|
|
|
160
152
|
};
|
|
161
153
|
}
|
|
162
154
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
if (typeof value === 'object') return JSON.stringify(value);
|
|
168
|
-
return String(value);
|
|
155
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
156
|
+
function defaultStringify(value: unknown): any {
|
|
157
|
+
if (value instanceof EntityId) return value.toJSON();
|
|
158
|
+
return value;
|
|
169
159
|
}
|
|
170
160
|
|
|
171
|
-
export function buildDiffViewModel(
|
|
172
|
-
|
|
173
|
-
options: DiffFormatterOptions
|
|
174
|
-
): DiffViewModel[] {
|
|
175
|
-
const { resolveLabel, formatValue = defaultStringify } = options;
|
|
161
|
+
export function buildDiffViewModel(diffs: DiffEntry[], formatValue?: DiffFormatter): DiffViewModel[] {
|
|
162
|
+
const formatter = formatValue || defaultStringify;
|
|
176
163
|
|
|
177
164
|
const seen = new Set<string>();
|
|
178
165
|
const result: DiffViewModel[] = [];
|
|
@@ -180,16 +167,8 @@ export function buildDiffViewModel(
|
|
|
180
167
|
for (const entry of diffs) {
|
|
181
168
|
const ctx = buildLabelContext(entry);
|
|
182
169
|
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
const label = resolvedLabel ?? entry.path;
|
|
187
|
-
|
|
188
|
-
const beforeFormatted =
|
|
189
|
-
entry.before !== undefined ? formatValue(entry.before, ctx) : undefined;
|
|
190
|
-
|
|
191
|
-
const afterFormatted =
|
|
192
|
-
entry.after !== undefined ? formatValue(entry.after, ctx) : undefined;
|
|
170
|
+
const beforeFormatted = entry.before !== undefined ? formatter(entry.before, ctx) : undefined;
|
|
171
|
+
const afterFormatted = entry.after !== undefined ? formatter(entry.after, ctx) : undefined;
|
|
193
172
|
|
|
194
173
|
// якщо форматовано однаково — не зміна
|
|
195
174
|
if (entry.kind === 'changed' && beforeFormatted === afterFormatted) {
|
|
@@ -206,7 +185,6 @@ export function buildDiffViewModel(
|
|
|
206
185
|
|
|
207
186
|
result.push({
|
|
208
187
|
kind: entry.kind,
|
|
209
|
-
label,
|
|
210
188
|
path: entry.path,
|
|
211
189
|
index: ctx.index,
|
|
212
190
|
beforeRaw: entry.before,
|
|
@@ -218,3 +196,14 @@ export function buildDiffViewModel(
|
|
|
218
196
|
|
|
219
197
|
return result;
|
|
220
198
|
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Повертає diff у вигляді масиву обʼєктів (DiffViewModel),
|
|
202
|
+
*/
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
204
|
+
export function getDiff(beforeObj: any, afterObj: any, formatter?: DiffFormatter): DiffViewModel[] | null {
|
|
205
|
+
const diffs = diffObjects(beforeObj, afterObj);
|
|
206
|
+
if (diffs.length === 0) return null;
|
|
207
|
+
|
|
208
|
+
return buildDiffViewModel(diffs, formatter);
|
|
209
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { Eventable } from './mixins/Eventable';
|
|
|
10
10
|
import { Application } from './application/Application';
|
|
11
11
|
import { ApplicationModule } from './application/ApplicationModule';
|
|
12
12
|
import { bootstrap } from './bootstrap';
|
|
13
|
+
import { getDiff, DiffFormatter, DiffViewModel } from './helpers/diff';
|
|
13
14
|
|
|
14
15
|
export {
|
|
15
16
|
Entity,
|
|
@@ -25,5 +26,9 @@ export {
|
|
|
25
26
|
Application,
|
|
26
27
|
ApplicationModule,
|
|
27
28
|
|
|
28
|
-
bootstrap
|
|
29
|
+
bootstrap,
|
|
30
|
+
|
|
31
|
+
DiffViewModel,
|
|
32
|
+
DiffFormatter,
|
|
33
|
+
getDiff
|
|
29
34
|
}
|