@volontariapp/post-processors 3.3.15 → 3.4.0-snap-974e963
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/CHANGELOG.md +13 -0
- package/dist/common/base-storage-entity-result.post-processor.d.ts +16 -0
- package/dist/common/base-storage-entity-result.post-processor.d.ts.map +1 -0
- package/dist/common/base-storage-entity-result.post-processor.js +67 -0
- package/dist/common/base-storage-entity-result.post-processor.js.map +1 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +1 -0
- package/dist/common/index.js.map +1 -1
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.d.ts +2 -0
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.d.ts.map +1 -0
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.js +135 -0
- package/dist/test/common/base-storage-entity-result.post-processor.unit.spec.js.map +1 -0
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- feat(post-processors): add BaseStorageEntityResultPostProcessor for standardized handling of storage result events
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies []:
|
|
12
|
+
- @volontariapp/messaging@2.29.0
|
|
13
|
+
- @volontariapp/database@3.10.14
|
|
14
|
+
- @volontariapp/outbox@0.10.18
|
|
15
|
+
|
|
3
16
|
## 3.3.15
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BatchPostProcessor } from '../core/processors/batch.post-processor.js';
|
|
2
|
+
import type { PostProcessorOptions, BatchEventItem } from '../interfaces/index.js';
|
|
3
|
+
import type { Redis } from 'ioredis';
|
|
4
|
+
import type { StorageEventMessagingType, StorageEntityType, IStorageFileEntityPayload } from '@volontariapp/messaging';
|
|
5
|
+
export type StorageResultEventType = StorageEventMessagingType.FILE_SCANNED | StorageEventMessagingType.FILE_REJECTED | StorageEventMessagingType.ATTACHMENT_REJECTED;
|
|
6
|
+
export declare abstract class BaseStorageEntityResultPostProcessor<TEvent extends StorageResultEventType = StorageResultEventType, TStatus = unknown, TResult extends object | boolean = boolean> extends BatchPostProcessor<TEvent> {
|
|
7
|
+
protected readonly expectedEventType: TEvent;
|
|
8
|
+
protected readonly expectedEntityType: StorageEntityType;
|
|
9
|
+
protected readonly targetStatus: TStatus;
|
|
10
|
+
constructor(redisDriver: Redis, options: PostProcessorOptions, expectedEventType: TEvent, expectedEntityType: StorageEntityType, targetStatus: TStatus);
|
|
11
|
+
protected shouldProcess(eventType: TEvent | string): boolean;
|
|
12
|
+
protected processEvents(events: BatchEventItem<TEvent>[]): Promise<void>;
|
|
13
|
+
protected abstract applyResult(entityId: string, fileId: string, status: TStatus, payload: IStorageFileEntityPayload): Promise<TResult | null | undefined>;
|
|
14
|
+
protected onSuccess(entityId: string, fileId: string, _result: TResult, messageId: string): Promise<void> | void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=base-storage-entity-result.post-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.d.ts","sourceRoot":"","sources":["../../src/common/base-storage-entity-result.post-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EACV,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,sBAAsB,GAC9B,yBAAyB,CAAC,YAAY,GACtC,yBAAyB,CAAC,aAAa,GACvC,yBAAyB,CAAC,mBAAmB,CAAC;AASlD,8BAAsB,oCAAoC,CACxD,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,OAAO,GAAG,OAAO,EACjB,OAAO,SAAS,MAAM,GAAG,OAAO,GAAG,OAAO,CAC1C,SAAQ,kBAAkB,CAAC,MAAM,CAAC;IAIhC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAC5C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,iBAAiB;IACxD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO;gBAJxC,WAAW,EAAE,KAAK,EAClB,OAAO,EAAE,oBAAoB,EACV,iBAAiB,EAAE,MAAM,EACzB,kBAAkB,EAAE,iBAAiB,EACrC,YAAY,EAAE,OAAO;cAKvB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;cAIrD,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8E9E,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAMtC,SAAS,CAAC,SAAS,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAWxB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { BatchPostProcessor } from '../core/processors/batch.post-processor.js';
|
|
2
|
+
export class BaseStorageEntityResultPostProcessor extends BatchPostProcessor {
|
|
3
|
+
expectedEventType;
|
|
4
|
+
expectedEntityType;
|
|
5
|
+
targetStatus;
|
|
6
|
+
constructor(redisDriver, options, expectedEventType, expectedEntityType, targetStatus) {
|
|
7
|
+
super(redisDriver, options);
|
|
8
|
+
this.expectedEventType = expectedEventType;
|
|
9
|
+
this.expectedEntityType = expectedEntityType;
|
|
10
|
+
this.targetStatus = targetStatus;
|
|
11
|
+
}
|
|
12
|
+
shouldProcess(eventType) {
|
|
13
|
+
return eventType === this.expectedEventType.toString();
|
|
14
|
+
}
|
|
15
|
+
async processEvents(events) {
|
|
16
|
+
for (const { event, messageId } of events) {
|
|
17
|
+
const rawPayload = event.payload;
|
|
18
|
+
const payload = rawPayload?.after;
|
|
19
|
+
if (!payload?.fileId || !payload.entityId) {
|
|
20
|
+
this.logger.error(`Invalid payload for ${String(this.expectedEventType)}: missing required fields`, {
|
|
21
|
+
messageId,
|
|
22
|
+
payload: event.payload,
|
|
23
|
+
});
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (payload.entityType !== this.expectedEntityType) {
|
|
27
|
+
this.logger.debug(`Ignoring storage event for non-${this.expectedEntityType.toLowerCase()} entity: ${String(payload.entityType)}`, {
|
|
28
|
+
messageId,
|
|
29
|
+
fileId: payload.fileId,
|
|
30
|
+
entityId: payload.entityId,
|
|
31
|
+
entityType: payload.entityType,
|
|
32
|
+
});
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const updated = await this.applyResult(payload.entityId, payload.fileId, this.targetStatus, payload);
|
|
37
|
+
if (!updated) {
|
|
38
|
+
this.logger.warn(`Entity not found when applying storage result for ${this.expectedEntityType} ${payload.entityId}`, {
|
|
39
|
+
messageId,
|
|
40
|
+
entityId: payload.entityId,
|
|
41
|
+
fileId: payload.fileId,
|
|
42
|
+
});
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
await this.onSuccess(payload.entityId, payload.fileId, updated, messageId);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
this.logger.error(`Failed to apply storage result status for ${this.expectedEntityType} ${payload.entityId}`, error, {
|
|
49
|
+
messageId,
|
|
50
|
+
entityId: payload.entityId,
|
|
51
|
+
fileId: payload.fileId,
|
|
52
|
+
status: this.targetStatus,
|
|
53
|
+
});
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
onSuccess(entityId, fileId, _result, messageId) {
|
|
59
|
+
this.logger.info(`Successfully applied storage result status for ${this.expectedEntityType} ${entityId} and file ${fileId}`, {
|
|
60
|
+
messageId,
|
|
61
|
+
entityId,
|
|
62
|
+
fileId,
|
|
63
|
+
status: this.targetStatus,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=base-storage-entity-result.post-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.js","sourceRoot":"","sources":["../../src/common/base-storage-entity-result.post-processor.ts"],"names":[],"mappings":"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"}
|
package/dist/common/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC"}
|
package/dist/common/index.js
CHANGED
package/dist/common/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/common/base-storage-entity-result.post-processor.unit.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, jest } from '@jest/globals';
|
|
2
|
+
import { createMock } from '@volontariapp/testing';
|
|
3
|
+
import { StorageEventMessagingType, StorageEntityType, } from '@volontariapp/messaging';
|
|
4
|
+
import { BaseStorageEntityResultPostProcessor, } from '../../common/base-storage-entity-result.post-processor.js';
|
|
5
|
+
class ConcreteStorageEntityResultPostProcessor extends BaseStorageEntityResultPostProcessor {
|
|
6
|
+
applyResultMock = jest.fn();
|
|
7
|
+
onSuccessMock = jest.fn();
|
|
8
|
+
applyResult(entityId, fileId, status, payload) {
|
|
9
|
+
return this.applyResultMock(entityId, fileId, status, payload);
|
|
10
|
+
}
|
|
11
|
+
onSuccess(entityId, fileId, result, messageId) {
|
|
12
|
+
void super.onSuccess(entityId, fileId, result, messageId);
|
|
13
|
+
return this.onSuccessMock(entityId, fileId, result, messageId);
|
|
14
|
+
}
|
|
15
|
+
testProcessEvents(events) {
|
|
16
|
+
return this.processEvents(events);
|
|
17
|
+
}
|
|
18
|
+
testShouldProcess(eventType) {
|
|
19
|
+
return this.shouldProcess(eventType);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
describe('BaseStorageEntityResultPostProcessor — Unit', () => {
|
|
23
|
+
let redisMock;
|
|
24
|
+
let processor;
|
|
25
|
+
const validOptions = {
|
|
26
|
+
streamName: 'stream:storage:scanned',
|
|
27
|
+
groupName: 'group:test',
|
|
28
|
+
consumerName: 'consumer-test',
|
|
29
|
+
};
|
|
30
|
+
const expectedEventType = StorageEventMessagingType.FILE_SCANNED;
|
|
31
|
+
const expectedEntityType = StorageEntityType.POST;
|
|
32
|
+
const targetStatus = 'CLEAN';
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
jest.clearAllMocks();
|
|
35
|
+
redisMock = createMock();
|
|
36
|
+
redisMock.duplicate.mockReturnValue(redisMock);
|
|
37
|
+
processor = new ConcreteStorageEntityResultPostProcessor(redisMock, validOptions, expectedEventType, expectedEntityType, targetStatus);
|
|
38
|
+
});
|
|
39
|
+
describe('shouldProcess', () => {
|
|
40
|
+
it('should return true when event type matches expectedEventType', () => {
|
|
41
|
+
expect(processor.testShouldProcess(StorageEventMessagingType.FILE_SCANNED)).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('should return false when event type does not match', () => {
|
|
44
|
+
expect(processor.testShouldProcess(StorageEventMessagingType.FILE_REJECTED)).toBe(false);
|
|
45
|
+
expect(processor.testShouldProcess('unknown.event')).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('processEvents', () => {
|
|
49
|
+
const buildBatchItem = (payloadOverride, messageId = '1700000000000-0') => {
|
|
50
|
+
const payload = payloadOverride === null
|
|
51
|
+
? null
|
|
52
|
+
: {
|
|
53
|
+
fileId: 'file-123',
|
|
54
|
+
entityId: 'post-456',
|
|
55
|
+
entityType: StorageEntityType.POST,
|
|
56
|
+
ownerId: 'user-789',
|
|
57
|
+
...payloadOverride,
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
messageId,
|
|
61
|
+
event: {
|
|
62
|
+
id: 'evt-1',
|
|
63
|
+
version: 1,
|
|
64
|
+
type: StorageEventMessagingType.FILE_SCANNED,
|
|
65
|
+
emitter: 'ms-storage',
|
|
66
|
+
emitterId: 'file-123',
|
|
67
|
+
traceId: 'trace-1',
|
|
68
|
+
correlationId: 'corr-1',
|
|
69
|
+
createdAt: new Date().toISOString(),
|
|
70
|
+
payload: {
|
|
71
|
+
before: undefined,
|
|
72
|
+
after: payload,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
it('should successfully apply result and call onSuccess for matching entity', async () => {
|
|
78
|
+
const batchItem = buildBatchItem();
|
|
79
|
+
const updatedEntity = {
|
|
80
|
+
id: 'post-456',
|
|
81
|
+
fileId: 'file-123',
|
|
82
|
+
status: targetStatus,
|
|
83
|
+
};
|
|
84
|
+
processor.applyResultMock.mockResolvedValueOnce(updatedEntity);
|
|
85
|
+
await processor.testProcessEvents([batchItem]);
|
|
86
|
+
expect(processor.applyResultMock).toHaveBeenCalledTimes(1);
|
|
87
|
+
expect(processor.applyResultMock).toHaveBeenCalledWith('post-456', 'file-123', targetStatus, expect.objectContaining({
|
|
88
|
+
entityId: 'post-456',
|
|
89
|
+
fileId: 'file-123',
|
|
90
|
+
entityType: StorageEntityType.POST,
|
|
91
|
+
}));
|
|
92
|
+
expect(processor.onSuccessMock).toHaveBeenCalledTimes(1);
|
|
93
|
+
expect(processor.onSuccessMock).toHaveBeenCalledWith('post-456', 'file-123', updatedEntity, '1700000000000-0');
|
|
94
|
+
});
|
|
95
|
+
it('should skip event when entityType does not match expectedEntityType', async () => {
|
|
96
|
+
const batchItem = buildBatchItem({ entityType: StorageEntityType.EVENT_COVER });
|
|
97
|
+
await processor.testProcessEvents([batchItem]);
|
|
98
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
99
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
100
|
+
});
|
|
101
|
+
it('should skip event when fileId is missing', async () => {
|
|
102
|
+
const batchItem = buildBatchItem({ fileId: '' });
|
|
103
|
+
await processor.testProcessEvents([batchItem]);
|
|
104
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
105
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
106
|
+
});
|
|
107
|
+
it('should skip event when entityId is missing', async () => {
|
|
108
|
+
const batchItem = buildBatchItem({ entityId: '' });
|
|
109
|
+
await processor.testProcessEvents([batchItem]);
|
|
110
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
111
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
112
|
+
});
|
|
113
|
+
it('should skip event when payload is null or missing', async () => {
|
|
114
|
+
const batchItem = buildBatchItem(null);
|
|
115
|
+
await processor.testProcessEvents([batchItem]);
|
|
116
|
+
expect(processor.applyResultMock).not.toHaveBeenCalled();
|
|
117
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
118
|
+
});
|
|
119
|
+
it('should not throw and not call onSuccess if entity is not found (returns null)', async () => {
|
|
120
|
+
const batchItem = buildBatchItem();
|
|
121
|
+
processor.applyResultMock.mockResolvedValueOnce(null);
|
|
122
|
+
await expect(processor.testProcessEvents([batchItem])).resolves.not.toThrow();
|
|
123
|
+
expect(processor.applyResultMock).toHaveBeenCalledTimes(1);
|
|
124
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
125
|
+
});
|
|
126
|
+
it('should re-throw error if applyResult throws an error', async () => {
|
|
127
|
+
const batchItem = buildBatchItem();
|
|
128
|
+
const dbError = new Error('Database connection failed');
|
|
129
|
+
processor.applyResultMock.mockRejectedValueOnce(dbError);
|
|
130
|
+
await expect(processor.testProcessEvents([batchItem])).rejects.toThrow('Database connection failed');
|
|
131
|
+
expect(processor.onSuccessMock).not.toHaveBeenCalled();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=base-storage-entity-result.post-processor.unit.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-storage-entity-result.post-processor.unit.spec.js","sourceRoot":"","sources":["../../../src/test/common/base-storage-entity-result.post-processor.unit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,yBAAyB,EACzB,iBAAiB,GAElB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oCAAoC,GACrC,MAAM,2DAA2D,CAAC;AASnE,MAAM,wCAAyC,SAAQ,oCAItD;IACQ,eAAe,GAAG,IAAI,CAAC,EAAE,EAO7B,CAAC;IAEG,aAAa,GAAG,IAAI,CAAC,EAAE,EAO3B,CAAC;IAEe,WAAW,CAC5B,QAAgB,EAChB,MAAc,EACd,MAAc,EACd,OAAkC;QAElC,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAEkB,SAAS,CAC1B,QAAgB,EAChB,MAAc,EACd,MAAyB,EACzB,SAAiB;QAEjB,KAAK,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAGM,iBAAiB,CACtB,MAAgE;QAEhE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAEM,iBAAiB,CAAC,SAA0D;QACjF,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;CACF;AAED,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,IAAI,SAA6B,CAAC;IAClC,IAAI,SAAmD,CAAC;IAExD,MAAM,YAAY,GAAyB;QACzC,UAAU,EAAE,wBAAwB;QACpC,SAAS,EAAE,YAAY;QACvB,YAAY,EAAE,eAAe;KAC9B,CAAC;IAEF,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,YAAY,CAAC;IACjE,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,SAAS,GAAG,UAAU,EAAS,CAAC;QAChC,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAE/C,SAAS,GAAG,IAAI,wCAAwC,CACtD,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,CACb,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzF,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,MAAM,cAAc,GAAG,CACrB,eAA2D,EAC3D,SAAS,GAAG,iBAAiB,EAC2B,EAAE;YAC1D,MAAM,OAAO,GACX,eAAe,KAAK,IAAI;gBACtB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC;oBACE,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,UAAU;oBACpB,UAAU,EAAE,iBAAiB,CAAC,IAAI;oBAClC,OAAO,EAAE,UAAU;oBACnB,GAAG,eAAe;iBACnB,CAAC;YAER,OAAO;gBACL,SAAS;gBACT,KAAK,EAAE;oBACL,EAAE,EAAE,OAAO;oBACX,OAAO,EAAE,CAAC;oBACV,IAAI,EAAE,yBAAyB,CAAC,YAAY;oBAC5C,OAAO,EAAE,YAAY;oBACrB,SAAS,EAAE,UAAU;oBACrB,OAAO,EAAE,SAAS;oBAClB,aAAa,EAAE,QAAQ;oBACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,OAAO,EAAE;wBACP,MAAM,EAAE,SAAS;wBACjB,KAAK,EAAE,OAAO;qBACf;iBACF;aACmE,CAAC;QACzE,CAAC,CAAC;QAEF,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;YACnC,MAAM,aAAa,GAAsB;gBACvC,EAAE,EAAE,UAAU;gBACd,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,YAAY;aACrB,CAAC;YAEF,SAAS,CAAC,eAAe,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAE/D,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,oBAAoB,CACpD,UAAU,EACV,UAAU,EACV,YAAY,EACZ,MAAM,CAAC,gBAAgB,CAAC;gBACtB,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,UAAU;gBAClB,UAAU,EAAE,iBAAiB,CAAC,IAAI;aACnC,CAAC,CACH,CAAC;YACF,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAClD,UAAU,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC;YAEhF,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAEjD,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAEnD,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;YAC7F,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;YACnC,SAAS,CAAC,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAEtD,MAAM,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAE9E,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACxD,SAAS,CAAC,eAAe,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAEzD,MAAM,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YACrG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volontariapp/post-processors",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0-snap-974e963",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"provenance": true
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"test:int:watch": "INTEGRATION=true node --experimental-vm-modules $(yarn bin jest) --watch"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@volontariapp/database": "3.10.
|
|
40
|
+
"@volontariapp/database": "3.10.14-snap-974e963",
|
|
41
41
|
"@volontariapp/health-check": "1.0.10",
|
|
42
42
|
"@volontariapp/logger": "0.4.0",
|
|
43
|
-
"@volontariapp/messaging": "2.
|
|
44
|
-
"@volontariapp/outbox": "0.10.
|
|
43
|
+
"@volontariapp/messaging": "2.29.0-snap-974e963",
|
|
44
|
+
"@volontariapp/outbox": "0.10.18-snap-974e963",
|
|
45
45
|
"@volontariapp/shared": "0.17.0"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|