ts-patch-mongoose 1.2.1 → 1.2.3
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/dist/cjs/plugin.js +51 -46
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/cjs/types/plugin.d.ts.map +1 -1
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/plugin.mjs +51 -46
- package/dist/esm/types/plugin.d.ts.map +1 -1
- package/package.json +6 -5
- package/src/plugin.ts +58 -56
- package/tests/plugin-event-updated.test.ts +4 -4
package/dist/cjs/plugin.js
CHANGED
|
@@ -32,9 +32,35 @@ const deleteMethods = [
|
|
|
32
32
|
'deleteOne',
|
|
33
33
|
'deleteMany'
|
|
34
34
|
];
|
|
35
|
+
function splitUpdateAndCommands(updateQuery) {
|
|
36
|
+
let update = {};
|
|
37
|
+
const commands = [];
|
|
38
|
+
if (!lodash_1.default.isEmpty(updateQuery) && !lodash_1.default.isArray(updateQuery) && lodash_1.default.isObjectLike(updateQuery)) {
|
|
39
|
+
update = lodash_1.default.cloneDeep(updateQuery);
|
|
40
|
+
const keys = lodash_1.default.keys(update).filter((key) => key.startsWith('$'));
|
|
41
|
+
if (!lodash_1.default.isEmpty(keys)) {
|
|
42
|
+
lodash_1.default.forEach(keys, (key) => {
|
|
43
|
+
commands.push({ [key]: update[key] });
|
|
44
|
+
delete update[key];
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { update, commands };
|
|
49
|
+
}
|
|
50
|
+
function assignUpdate(document, update, commands) {
|
|
51
|
+
let updated = (0, power_assign_1.assign)(document, update);
|
|
52
|
+
lodash_1.default.forEach(commands, (command) => {
|
|
53
|
+
try {
|
|
54
|
+
updated = (0, power_assign_1.assign)(updated, command);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return updated;
|
|
60
|
+
}
|
|
35
61
|
exports.patchEventEmitter = em_1.default;
|
|
36
62
|
const patchHistoryPlugin = function plugin(schema, opts) {
|
|
37
|
-
schema.pre('save', async function (
|
|
63
|
+
schema.pre('save', async function () {
|
|
38
64
|
const current = this.toObject(toObjectOptions);
|
|
39
65
|
const model = this.constructor;
|
|
40
66
|
const context = {
|
|
@@ -52,9 +78,8 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
52
78
|
await (0, patch_1.updatePatch)(opts, context, current, original);
|
|
53
79
|
}
|
|
54
80
|
}
|
|
55
|
-
next();
|
|
56
81
|
});
|
|
57
|
-
schema.post('insertMany', async function (docs
|
|
82
|
+
schema.post('insertMany', async function (docs) {
|
|
58
83
|
const context = {
|
|
59
84
|
op: 'create',
|
|
60
85
|
modelName: opts.modelName ?? this.modelName,
|
|
@@ -62,64 +87,47 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
62
87
|
createdDocs: docs
|
|
63
88
|
};
|
|
64
89
|
await (0, patch_1.createPatch)(opts, context);
|
|
65
|
-
next();
|
|
66
90
|
});
|
|
67
|
-
schema.pre(updateMethods, async function (
|
|
91
|
+
schema.pre(updateMethods, async function () {
|
|
68
92
|
const options = this.getOptions();
|
|
69
93
|
if (options.ignoreHook)
|
|
70
|
-
return
|
|
94
|
+
return;
|
|
71
95
|
const filter = this.getFilter();
|
|
72
|
-
const update = lodash_1.default.cloneDeep(this.getUpdate());
|
|
73
96
|
const count = await this.model.count(filter).exec();
|
|
74
|
-
const commands = [];
|
|
75
97
|
this._context = {
|
|
76
98
|
op: this.op,
|
|
77
99
|
modelName: opts.modelName ?? this.model.modelName,
|
|
78
100
|
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
79
101
|
isNew: options.upsert && count === 0
|
|
80
102
|
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const keys = lodash_1.default.keys(update).filter((key) => key.startsWith('$'));
|
|
84
|
-
if (!lodash_1.default.isEmpty(keys)) {
|
|
85
|
-
lodash_1.default.forEach(keys, (key) => {
|
|
86
|
-
commands.push({ [key]: update[key] });
|
|
87
|
-
delete update[key];
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
103
|
+
const updateQuery = this.getUpdate();
|
|
104
|
+
const { update, commands } = splitUpdateAndCommands(updateQuery);
|
|
91
105
|
const cursor = this.model.find(filter).cursor();
|
|
92
106
|
await cursor.eachAsync(async (doc) => {
|
|
93
|
-
|
|
107
|
+
const current = assignUpdate(doc.toObject(toObjectOptions), update, commands);
|
|
94
108
|
const original = doc.toObject(toObjectOptions);
|
|
95
|
-
current = (0, power_assign_1.assign)(current, update);
|
|
96
|
-
lodash_1.default.forEach(commands, (command) => {
|
|
97
|
-
try {
|
|
98
|
-
current = (0, power_assign_1.assign)(current, command);
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
109
|
await (0, patch_1.updatePatch)(opts, this._context, current, original);
|
|
104
110
|
});
|
|
105
|
-
next();
|
|
106
111
|
});
|
|
107
|
-
schema.post(updateMethods, async function (
|
|
112
|
+
schema.post(updateMethods, async function () {
|
|
108
113
|
const options = this.getOptions();
|
|
109
114
|
if (options.ignoreHook)
|
|
110
|
-
return next();
|
|
111
|
-
const update = this.getUpdate();
|
|
112
|
-
if (!update || !this._context.isNew)
|
|
113
115
|
return;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
if (!this._context.isNew)
|
|
117
|
+
return;
|
|
118
|
+
const updateQuery = this.getUpdate();
|
|
119
|
+
const { update, commands } = splitUpdateAndCommands(updateQuery);
|
|
120
|
+
const filter = assignUpdate({}, update, commands);
|
|
121
|
+
if (!lodash_1.default.isEmpty(filter)) {
|
|
122
|
+
const found = await this.model.findOne(update).exec();
|
|
123
|
+
if (found) {
|
|
124
|
+
const current = found.toObject(toObjectOptions);
|
|
125
|
+
this._context.createdDocs = [current];
|
|
126
|
+
await (0, patch_1.createPatch)(opts, this._context);
|
|
127
|
+
}
|
|
119
128
|
}
|
|
120
|
-
next();
|
|
121
129
|
});
|
|
122
|
-
schema.post('remove', async function (
|
|
130
|
+
schema.post('remove', async function () {
|
|
123
131
|
const original = this.toObject(toObjectOptions);
|
|
124
132
|
const model = this.constructor;
|
|
125
133
|
const context = {
|
|
@@ -131,12 +139,11 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
131
139
|
em_1.default.emit(opts.eventDeleted, { oldDoc: original });
|
|
132
140
|
}
|
|
133
141
|
await (0, patch_1.deletePatch)(opts, context);
|
|
134
|
-
next();
|
|
135
142
|
});
|
|
136
|
-
schema.pre(deleteMethods, options, async function (
|
|
143
|
+
schema.pre(deleteMethods, options, async function () {
|
|
137
144
|
const options = this.getOptions();
|
|
138
145
|
if (options.ignoreHook)
|
|
139
|
-
return
|
|
146
|
+
return;
|
|
140
147
|
const filter = this.getFilter();
|
|
141
148
|
this._context = {
|
|
142
149
|
op: this.op,
|
|
@@ -158,14 +165,12 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
158
165
|
if (opts.preDeleteCallback && lodash_1.default.isArray(this._context.deletedDocs) && !lodash_1.default.isEmpty(this._context.deletedDocs)) {
|
|
159
166
|
await opts.preDeleteCallback(this._context.deletedDocs);
|
|
160
167
|
}
|
|
161
|
-
next();
|
|
162
168
|
});
|
|
163
|
-
schema.post(deleteMethods, options, async function (
|
|
169
|
+
schema.post(deleteMethods, options, async function () {
|
|
164
170
|
const options = this.getOptions();
|
|
165
171
|
if (options.ignoreHook)
|
|
166
|
-
return
|
|
172
|
+
return;
|
|
167
173
|
await (0, patch_1.deletePatch)(opts, this._context);
|
|
168
|
-
next();
|
|
169
174
|
});
|
|
170
175
|
};
|
|
171
176
|
exports.patchHistoryPlugin = patchHistoryPlugin;
|
package/dist/cjs/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AACtB,+CAAqC;AAQrC,mCAA+D;AAC/D,sDAAqB;AAErB,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;CACZ,CAAA;AAED,MAAM,eAAe,GAAoB;IACvC,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,KAAK;CAChB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;CACpB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,QAAQ;IACR,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,WAAW;IACX,YAAY;CACb,CAAA;AAKY,QAAA,iBAAiB,GAAG,YAAE,CAAA;AAQ5B,MAAM,kBAAkB,GAAG,SAAS,MAAM,CAAK,MAAiB,EAAE,IAAuB;IAC9F,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,EAA+D,MAAM,UAAU,CAAA;AAErJ,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAoIlG,CAAA"}
|
package/dist/esm/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAQrC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,MAAM,MAAM,CAAA;AAErB,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;CACZ,CAAA;AAED,MAAM,eAAe,GAAoB;IACvC,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,KAAK;CAChB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;CACpB,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,QAAQ;IACR,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,WAAW;IACX,YAAY;CACb,CAAA;AAKD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAQnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,MAAM,CAAK,MAAiB,EAAE,IAAuB;IAC9F,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/plugin.mjs
CHANGED
|
@@ -28,9 +28,35 @@ const deleteMethods = [
|
|
|
28
28
|
'deleteOne',
|
|
29
29
|
'deleteMany'
|
|
30
30
|
];
|
|
31
|
+
function splitUpdateAndCommands(updateQuery) {
|
|
32
|
+
let update = {};
|
|
33
|
+
const commands = [];
|
|
34
|
+
if (!_.isEmpty(updateQuery) && !_.isArray(updateQuery) && _.isObjectLike(updateQuery)) {
|
|
35
|
+
update = _.cloneDeep(updateQuery);
|
|
36
|
+
const keys = _.keys(update).filter((key) => key.startsWith('$'));
|
|
37
|
+
if (!_.isEmpty(keys)) {
|
|
38
|
+
_.forEach(keys, (key) => {
|
|
39
|
+
commands.push({ [key]: update[key] });
|
|
40
|
+
delete update[key];
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { update, commands };
|
|
45
|
+
}
|
|
46
|
+
function assignUpdate(document, update, commands) {
|
|
47
|
+
let updated = assign(document, update);
|
|
48
|
+
_.forEach(commands, (command) => {
|
|
49
|
+
try {
|
|
50
|
+
updated = assign(updated, command);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return updated;
|
|
56
|
+
}
|
|
31
57
|
export const patchEventEmitter = em;
|
|
32
58
|
export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
33
|
-
schema.pre('save', async function (
|
|
59
|
+
schema.pre('save', async function () {
|
|
34
60
|
const current = this.toObject(toObjectOptions);
|
|
35
61
|
const model = this.constructor;
|
|
36
62
|
const context = {
|
|
@@ -48,9 +74,8 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
48
74
|
await updatePatch(opts, context, current, original);
|
|
49
75
|
}
|
|
50
76
|
}
|
|
51
|
-
next();
|
|
52
77
|
});
|
|
53
|
-
schema.post('insertMany', async function (docs
|
|
78
|
+
schema.post('insertMany', async function (docs) {
|
|
54
79
|
const context = {
|
|
55
80
|
op: 'create',
|
|
56
81
|
modelName: opts.modelName ?? this.modelName,
|
|
@@ -58,64 +83,47 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
58
83
|
createdDocs: docs
|
|
59
84
|
};
|
|
60
85
|
await createPatch(opts, context);
|
|
61
|
-
next();
|
|
62
86
|
});
|
|
63
|
-
schema.pre(updateMethods, async function (
|
|
87
|
+
schema.pre(updateMethods, async function () {
|
|
64
88
|
const options = this.getOptions();
|
|
65
89
|
if (options.ignoreHook)
|
|
66
|
-
return
|
|
90
|
+
return;
|
|
67
91
|
const filter = this.getFilter();
|
|
68
|
-
const update = _.cloneDeep(this.getUpdate());
|
|
69
92
|
const count = await this.model.count(filter).exec();
|
|
70
|
-
const commands = [];
|
|
71
93
|
this._context = {
|
|
72
94
|
op: this.op,
|
|
73
95
|
modelName: opts.modelName ?? this.model.modelName,
|
|
74
96
|
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
75
97
|
isNew: options.upsert && count === 0
|
|
76
98
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const keys = _.keys(update).filter((key) => key.startsWith('$'));
|
|
80
|
-
if (!_.isEmpty(keys)) {
|
|
81
|
-
_.forEach(keys, (key) => {
|
|
82
|
-
commands.push({ [key]: update[key] });
|
|
83
|
-
delete update[key];
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}
|
|
99
|
+
const updateQuery = this.getUpdate();
|
|
100
|
+
const { update, commands } = splitUpdateAndCommands(updateQuery);
|
|
87
101
|
const cursor = this.model.find(filter).cursor();
|
|
88
102
|
await cursor.eachAsync(async (doc) => {
|
|
89
|
-
|
|
103
|
+
const current = assignUpdate(doc.toObject(toObjectOptions), update, commands);
|
|
90
104
|
const original = doc.toObject(toObjectOptions);
|
|
91
|
-
current = assign(current, update);
|
|
92
|
-
_.forEach(commands, (command) => {
|
|
93
|
-
try {
|
|
94
|
-
current = assign(current, command);
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
105
|
await updatePatch(opts, this._context, current, original);
|
|
100
106
|
});
|
|
101
|
-
next();
|
|
102
107
|
});
|
|
103
|
-
schema.post(updateMethods, async function (
|
|
108
|
+
schema.post(updateMethods, async function () {
|
|
104
109
|
const options = this.getOptions();
|
|
105
110
|
if (options.ignoreHook)
|
|
106
|
-
return next();
|
|
107
|
-
const update = this.getUpdate();
|
|
108
|
-
if (!update || !this._context.isNew)
|
|
109
111
|
return;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
if (!this._context.isNew)
|
|
113
|
+
return;
|
|
114
|
+
const updateQuery = this.getUpdate();
|
|
115
|
+
const { update, commands } = splitUpdateAndCommands(updateQuery);
|
|
116
|
+
const filter = assignUpdate({}, update, commands);
|
|
117
|
+
if (!_.isEmpty(filter)) {
|
|
118
|
+
const found = await this.model.findOne(update).exec();
|
|
119
|
+
if (found) {
|
|
120
|
+
const current = found.toObject(toObjectOptions);
|
|
121
|
+
this._context.createdDocs = [current];
|
|
122
|
+
await createPatch(opts, this._context);
|
|
123
|
+
}
|
|
115
124
|
}
|
|
116
|
-
next();
|
|
117
125
|
});
|
|
118
|
-
schema.post('remove', async function (
|
|
126
|
+
schema.post('remove', async function () {
|
|
119
127
|
const original = this.toObject(toObjectOptions);
|
|
120
128
|
const model = this.constructor;
|
|
121
129
|
const context = {
|
|
@@ -127,12 +135,11 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
127
135
|
em.emit(opts.eventDeleted, { oldDoc: original });
|
|
128
136
|
}
|
|
129
137
|
await deletePatch(opts, context);
|
|
130
|
-
next();
|
|
131
138
|
});
|
|
132
|
-
schema.pre(deleteMethods, options, async function (
|
|
139
|
+
schema.pre(deleteMethods, options, async function () {
|
|
133
140
|
const options = this.getOptions();
|
|
134
141
|
if (options.ignoreHook)
|
|
135
|
-
return
|
|
142
|
+
return;
|
|
136
143
|
const filter = this.getFilter();
|
|
137
144
|
this._context = {
|
|
138
145
|
op: this.op,
|
|
@@ -154,14 +161,12 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
154
161
|
if (opts.preDeleteCallback && _.isArray(this._context.deletedDocs) && !_.isEmpty(this._context.deletedDocs)) {
|
|
155
162
|
await opts.preDeleteCallback(this._context.deletedDocs);
|
|
156
163
|
}
|
|
157
|
-
next();
|
|
158
164
|
});
|
|
159
|
-
schema.post(deleteMethods, options, async function (
|
|
165
|
+
schema.post(deleteMethods, options, async function () {
|
|
160
166
|
const options = this.getOptions();
|
|
161
167
|
if (options.ignoreHook)
|
|
162
|
-
return
|
|
168
|
+
return;
|
|
163
169
|
await deletePatch(opts, this._context);
|
|
164
|
-
next();
|
|
165
170
|
});
|
|
166
171
|
};
|
|
167
172
|
//# sourceMappingURL=plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,EAA+D,MAAM,UAAU,CAAA;AAErJ,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAoIlG,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-patch-mongoose",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "Patch history & events for mongoose models",
|
|
5
5
|
"author": "Alex Eagle",
|
|
6
6
|
"license": "MIT",
|
|
@@ -83,16 +83,16 @@
|
|
|
83
83
|
"devDependencies": {
|
|
84
84
|
"@shelf/jest-mongodb": "4.1.7",
|
|
85
85
|
"@swc/cli": "0.1.62",
|
|
86
|
-
"@swc/core": "1.3.
|
|
86
|
+
"@swc/core": "1.3.53",
|
|
87
87
|
"@swc/helpers": "0.5.0",
|
|
88
88
|
"@swc/jest": "0.2.26",
|
|
89
89
|
"@swc/register": "0.1.10",
|
|
90
|
-
"@types/jest": "29.5.
|
|
90
|
+
"@types/jest": "29.5.1",
|
|
91
91
|
"@types/lodash": "4.14.194",
|
|
92
|
-
"@types/node": "18.15.
|
|
92
|
+
"@types/node": "18.15.13",
|
|
93
93
|
"@typescript-eslint/eslint-plugin": "5.59.0",
|
|
94
94
|
"@typescript-eslint/parser": "5.59.0",
|
|
95
|
-
"eslint": "8.
|
|
95
|
+
"eslint": "8.39.0",
|
|
96
96
|
"eslint-config-standard": "17.0.0",
|
|
97
97
|
"eslint-plugin-import": "2.27.5",
|
|
98
98
|
"eslint-plugin-jest": "27.2.1",
|
|
@@ -105,6 +105,7 @@
|
|
|
105
105
|
"merge": "2.1.1",
|
|
106
106
|
"mongoose": "6.10.5",
|
|
107
107
|
"open-cli": "7.2.0",
|
|
108
|
+
"ts-node": "10.9.1",
|
|
108
109
|
"typescript": "5.0.4"
|
|
109
110
|
},
|
|
110
111
|
"peerDependencies": {
|
package/src/plugin.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _ from 'lodash'
|
|
2
2
|
import { assign } from 'power-assign'
|
|
3
3
|
|
|
4
|
-
import type { HydratedDocument, Model, MongooseQueryMiddleware, Schema, ToObjectOptions } from 'mongoose'
|
|
4
|
+
import type { HydratedDocument, Model, MongooseQueryMiddleware, Schema, ToObjectOptions, UpdateQuery, UpdateWithAggregationPipeline } from 'mongoose'
|
|
5
5
|
|
|
6
6
|
import type IPluginOptions from './interfaces/IPluginOptions'
|
|
7
7
|
import type IContext from './interfaces/IContext'
|
|
@@ -40,6 +40,38 @@ const deleteMethods = [
|
|
|
40
40
|
'deleteMany'
|
|
41
41
|
]
|
|
42
42
|
|
|
43
|
+
function splitUpdateAndCommands<T> (updateQuery: UpdateWithAggregationPipeline | UpdateQuery<T> | null): { update: UpdateQuery<T>, commands: Record<string, unknown>[] } {
|
|
44
|
+
let update: UpdateQuery<T> = {}
|
|
45
|
+
const commands: Record<string, unknown>[] = []
|
|
46
|
+
|
|
47
|
+
if (!_.isEmpty(updateQuery) && !_.isArray(updateQuery) && _.isObjectLike(updateQuery)) {
|
|
48
|
+
update = _.cloneDeep(updateQuery)
|
|
49
|
+
const keys = _.keys(update).filter((key) => key.startsWith('$'))
|
|
50
|
+
if (!_.isEmpty(keys)) {
|
|
51
|
+
_.forEach(keys, (key) => {
|
|
52
|
+
commands.push({ [key]: update[key] as unknown })
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
54
|
+
delete update[key]
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return { update, commands }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function assignUpdate<T> (document: HydratedDocument<T>, update: UpdateQuery<T>, commands: Record<string, unknown>[]): HydratedDocument<T> {
|
|
63
|
+
let updated = assign(document, update)
|
|
64
|
+
_.forEach(commands, (command) => {
|
|
65
|
+
try {
|
|
66
|
+
updated = assign(updated, command)
|
|
67
|
+
} catch {
|
|
68
|
+
// we catch assign keys that are not implemented
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
return updated
|
|
73
|
+
}
|
|
74
|
+
|
|
43
75
|
/**
|
|
44
76
|
* @description Patch patch event emitter
|
|
45
77
|
*/
|
|
@@ -52,7 +84,7 @@ export const patchEventEmitter = em
|
|
|
52
84
|
* @returns {void}
|
|
53
85
|
*/
|
|
54
86
|
export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: IPluginOptions<T>): void {
|
|
55
|
-
schema.pre('save', async function (
|
|
87
|
+
schema.pre('save', async function () {
|
|
56
88
|
const current = this.toObject(toObjectOptions) as HydratedDocument<T>
|
|
57
89
|
const model = this.constructor as Model<T>
|
|
58
90
|
|
|
@@ -71,11 +103,9 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
71
103
|
await updatePatch(opts, context, current, original)
|
|
72
104
|
}
|
|
73
105
|
}
|
|
74
|
-
|
|
75
|
-
next()
|
|
76
106
|
})
|
|
77
107
|
|
|
78
|
-
schema.post('insertMany', async function (docs
|
|
108
|
+
schema.post('insertMany', async function (docs) {
|
|
79
109
|
const context = {
|
|
80
110
|
op: 'create',
|
|
81
111
|
modelName: opts.modelName ?? this.modelName,
|
|
@@ -84,18 +114,14 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
84
114
|
}
|
|
85
115
|
|
|
86
116
|
await createPatch(opts, context)
|
|
87
|
-
|
|
88
|
-
next()
|
|
89
117
|
})
|
|
90
118
|
|
|
91
|
-
schema.pre(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T
|
|
119
|
+
schema.pre(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T>) {
|
|
92
120
|
const options = this.getOptions()
|
|
93
|
-
if (options.ignoreHook) return
|
|
121
|
+
if (options.ignoreHook) return
|
|
94
122
|
|
|
95
123
|
const filter = this.getFilter()
|
|
96
|
-
const update = _.cloneDeep(this.getUpdate()) as Record<string, Partial<T>> | null
|
|
97
124
|
const count = await this.model.count(filter).exec()
|
|
98
|
-
const commands: Record<string, Partial<T>>[] = []
|
|
99
125
|
|
|
100
126
|
this._context = {
|
|
101
127
|
op: this.op,
|
|
@@ -104,58 +130,40 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
104
130
|
isNew: options.upsert && count === 0
|
|
105
131
|
}
|
|
106
132
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const keys = _.keys(update).filter((key) => key.startsWith('$'))
|
|
110
|
-
if (!_.isEmpty(keys)) {
|
|
111
|
-
_.forEach(keys, (key) => {
|
|
112
|
-
commands.push({ [key]: update[key] })
|
|
113
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
114
|
-
delete update[key]
|
|
115
|
-
})
|
|
116
|
-
}
|
|
117
|
-
}
|
|
133
|
+
const updateQuery = this.getUpdate()
|
|
134
|
+
const { update, commands } = splitUpdateAndCommands(updateQuery)
|
|
118
135
|
|
|
119
136
|
const cursor = this.model.find<HydratedDocument<T>>(filter).cursor()
|
|
120
137
|
await cursor.eachAsync(async (doc) => {
|
|
121
|
-
|
|
138
|
+
const current = assignUpdate(doc.toObject(toObjectOptions) as HydratedDocument<T>, update, commands)
|
|
122
139
|
const original = doc.toObject(toObjectOptions) as HydratedDocument<T>
|
|
123
140
|
|
|
124
|
-
current = assign(current, update)
|
|
125
|
-
_.forEach(commands, (command) => {
|
|
126
|
-
try {
|
|
127
|
-
current = assign(current, command)
|
|
128
|
-
} catch (error) {
|
|
129
|
-
// we catch assign keys that are not implemented
|
|
130
|
-
}
|
|
131
|
-
})
|
|
132
|
-
|
|
133
141
|
await updatePatch(opts, this._context, current, original)
|
|
134
142
|
})
|
|
135
|
-
|
|
136
|
-
next()
|
|
137
143
|
})
|
|
138
144
|
|
|
139
|
-
schema.post(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T
|
|
145
|
+
schema.post(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T>) {
|
|
140
146
|
const options = this.getOptions()
|
|
141
|
-
if (options.ignoreHook) return
|
|
147
|
+
if (options.ignoreHook) return
|
|
142
148
|
|
|
143
|
-
|
|
149
|
+
if (!this._context.isNew) return
|
|
144
150
|
|
|
145
|
-
|
|
151
|
+
const updateQuery = this.getUpdate()
|
|
152
|
+
const { update, commands } = splitUpdateAndCommands(updateQuery)
|
|
146
153
|
|
|
147
|
-
const
|
|
148
|
-
if (
|
|
149
|
-
const
|
|
150
|
-
|
|
154
|
+
const filter = assignUpdate({} as HydratedDocument<T>, update, commands)
|
|
155
|
+
if (!_.isEmpty(filter)) {
|
|
156
|
+
const found = await this.model.findOne<HydratedDocument<T>>(update).exec()
|
|
157
|
+
if (found) {
|
|
158
|
+
const current = found.toObject(toObjectOptions) as HydratedDocument<T>
|
|
159
|
+
this._context.createdDocs = [current]
|
|
151
160
|
|
|
152
|
-
|
|
161
|
+
await createPatch(opts, this._context)
|
|
162
|
+
}
|
|
153
163
|
}
|
|
154
|
-
|
|
155
|
-
next()
|
|
156
164
|
})
|
|
157
165
|
|
|
158
|
-
schema.post('remove', async function (this: HydratedDocument<T
|
|
166
|
+
schema.post('remove', async function (this: HydratedDocument<T>) {
|
|
159
167
|
const original = this.toObject(toObjectOptions)
|
|
160
168
|
const model = this.constructor as Model<T>
|
|
161
169
|
|
|
@@ -170,13 +178,11 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
170
178
|
}
|
|
171
179
|
|
|
172
180
|
await deletePatch(opts, context)
|
|
173
|
-
|
|
174
|
-
next()
|
|
175
181
|
})
|
|
176
182
|
|
|
177
|
-
schema.pre(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T
|
|
183
|
+
schema.pre(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T>) {
|
|
178
184
|
const options = this.getOptions()
|
|
179
|
-
if (options.ignoreHook) return
|
|
185
|
+
if (options.ignoreHook) return
|
|
180
186
|
|
|
181
187
|
const filter = this.getFilter()
|
|
182
188
|
|
|
@@ -201,16 +207,12 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
201
207
|
if (opts.preDeleteCallback && _.isArray(this._context.deletedDocs) && !_.isEmpty(this._context.deletedDocs)) {
|
|
202
208
|
await opts.preDeleteCallback(this._context.deletedDocs)
|
|
203
209
|
}
|
|
204
|
-
|
|
205
|
-
next()
|
|
206
210
|
})
|
|
207
211
|
|
|
208
|
-
schema.post(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T
|
|
212
|
+
schema.post(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T>) {
|
|
209
213
|
const options = this.getOptions()
|
|
210
|
-
if (options.ignoreHook) return
|
|
214
|
+
if (options.ignoreHook) return
|
|
211
215
|
|
|
212
216
|
await deletePatch(opts, this._context)
|
|
213
|
-
|
|
214
|
-
next()
|
|
215
217
|
})
|
|
216
218
|
}
|
|
@@ -98,7 +98,7 @@ describe('plugin - event updated & patch history disabled', () => {
|
|
|
98
98
|
expect(em.emit).toHaveBeenCalledTimes(3)
|
|
99
99
|
|
|
100
100
|
// Confirm that the document is updated
|
|
101
|
-
const updated = await User.find({})
|
|
101
|
+
const updated = await User.find({}).sort({ name: 1 })
|
|
102
102
|
expect(updated).toHaveLength(3)
|
|
103
103
|
const [alice, bob, john] = updated
|
|
104
104
|
expect(alice.role).toBe('manager')
|
|
@@ -123,7 +123,7 @@ describe('plugin - event updated & patch history disabled', () => {
|
|
|
123
123
|
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
124
124
|
|
|
125
125
|
// Confirm that the document is updated
|
|
126
|
-
const updated = await User.find({})
|
|
126
|
+
const updated = await User.find({}).sort({ name: 1 })
|
|
127
127
|
expect(updated).toHaveLength(3)
|
|
128
128
|
const [alice, bob, john] = updated
|
|
129
129
|
expect(alice.role).toBe('user')
|
|
@@ -172,7 +172,7 @@ describe('plugin - event updated & patch history disabled', () => {
|
|
|
172
172
|
})
|
|
173
173
|
|
|
174
174
|
// Confirm that the document is updated
|
|
175
|
-
const updated = await User.find({})
|
|
175
|
+
const updated = await User.find({}).sort({ name: 1 })
|
|
176
176
|
expect(updated).toHaveLength(3)
|
|
177
177
|
const [alice, bob, john] = updated
|
|
178
178
|
expect(alice.role).toBe('user')
|
|
@@ -197,7 +197,7 @@ describe('plugin - event updated & patch history disabled', () => {
|
|
|
197
197
|
expect(em.emit).toHaveBeenCalledTimes(3)
|
|
198
198
|
|
|
199
199
|
// Confirm that the document is updated
|
|
200
|
-
const updated = await User.find({})
|
|
200
|
+
const updated = await User.find({}).sort({ name: 1 })
|
|
201
201
|
expect(updated).toHaveLength(3)
|
|
202
202
|
const [alice, bob, john] = updated
|
|
203
203
|
expect(alice.role).toBe('manager')
|