@sera4/essentia 3.0.13 → 3.0.14
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/ts/cache/index.d.ts +33 -0
- package/dist/ts/cache/index.js +171 -0
- package/dist/ts/cache/index.js.map +1 -0
- package/dist/ts/configurations/server-config.d.ts +4 -0
- package/dist/ts/configurations/server-config.js +2 -0
- package/dist/ts/configurations/server-config.js.map +1 -0
- package/dist/ts/constants/index.d.ts +7 -0
- package/dist/ts/constants/index.js +8 -0
- package/dist/ts/constants/index.js.map +1 -0
- package/dist/ts/cycle/index.d.ts +53 -0
- package/dist/ts/cycle/index.js +169 -0
- package/dist/ts/cycle/index.js.map +1 -0
- package/dist/ts/dns/DnsCache.d.ts +50 -0
- package/dist/ts/dns/DnsCache.js +137 -0
- package/dist/ts/dns/DnsCache.js.map +1 -0
- package/dist/ts/dns/index.d.ts +4 -0
- package/dist/ts/dns/index.js +4 -0
- package/dist/ts/dns/index.js.map +1 -0
- package/dist/ts/formatter/index.d.ts +44 -0
- package/dist/ts/formatter/index.js +76 -0
- package/dist/ts/formatter/index.js.map +1 -0
- package/dist/ts/hal/index.d.ts +26 -0
- package/dist/ts/hal/index.js +70 -0
- package/dist/ts/hal/index.js.map +1 -0
- package/dist/ts/health/index.d.ts +53 -0
- package/dist/ts/health/index.js +165 -0
- package/dist/ts/health/index.js.map +1 -0
- package/dist/ts/helpers/index.d.ts +1 -0
- package/dist/ts/helpers/index.js +2 -0
- package/dist/ts/helpers/index.js.map +1 -0
- package/dist/ts/helpers/test-server-wrapper.d.ts +56 -0
- package/dist/ts/helpers/test-server-wrapper.js +144 -0
- package/dist/ts/helpers/test-server-wrapper.js.map +1 -0
- package/dist/ts/index.d.ts +22 -0
- package/dist/ts/index.js +27 -0
- package/dist/ts/index.js.map +1 -0
- package/dist/ts/last-commit/index.d.ts +12 -0
- package/dist/ts/last-commit/index.js +82 -0
- package/dist/ts/last-commit/index.js.map +1 -0
- package/dist/ts/logger/index.d.ts +3 -0
- package/dist/ts/logger/index.js +4 -0
- package/dist/ts/logger/index.js.map +1 -0
- package/dist/ts/logger/s4-logger.d.ts +23 -0
- package/dist/ts/logger/s4-logger.js +105 -0
- package/dist/ts/logger/s4-logger.js.map +1 -0
- package/dist/ts/paginator/index.d.ts +2 -0
- package/dist/ts/paginator/index.js +3 -0
- package/dist/ts/paginator/index.js.map +1 -0
- package/dist/ts/paginator/s4-pagination.d.ts +26 -0
- package/dist/ts/paginator/s4-pagination.js +49 -0
- package/dist/ts/paginator/s4-pagination.js.map +1 -0
- package/dist/ts/paginator/sql-pagination.d.ts +52 -0
- package/dist/ts/paginator/sql-pagination.js +157 -0
- package/dist/ts/paginator/sql-pagination.js.map +1 -0
- package/dist/ts/paper-trail/helpers.d.ts +14 -0
- package/dist/ts/paper-trail/helpers.js +74 -0
- package/dist/ts/paper-trail/helpers.js.map +1 -0
- package/dist/ts/paper-trail/index.d.ts +54 -0
- package/dist/ts/paper-trail/index.js +236 -0
- package/dist/ts/paper-trail/index.js.map +1 -0
- package/dist/ts/prompts/index.d.ts +21 -0
- package/dist/ts/prompts/index.js +68 -0
- package/dist/ts/prompts/index.js.map +1 -0
- package/dist/ts/queue/index.d.ts +232 -0
- package/dist/ts/queue/index.js +440 -0
- package/dist/ts/queue/index.js.map +1 -0
- package/dist/ts/queue/publisher.d.ts +41 -0
- package/dist/ts/queue/publisher.js +84 -0
- package/dist/ts/queue/publisher.js.map +1 -0
- package/dist/ts/queue/queue-logger.d.ts +10 -0
- package/dist/ts/queue/queue-logger.js +35 -0
- package/dist/ts/queue/queue-logger.js.map +1 -0
- package/dist/ts/queue/subscriber.d.ts +55 -0
- package/dist/ts/queue/subscriber.js +98 -0
- package/dist/ts/queue/subscriber.js.map +1 -0
- package/dist/ts/safe-proxy/index.d.ts +35 -0
- package/dist/ts/safe-proxy/index.js +54 -0
- package/dist/ts/safe-proxy/index.js.map +1 -0
- package/dist/ts/serializer/index.d.ts +52 -0
- package/dist/ts/serializer/index.js +83 -0
- package/dist/ts/serializer/index.js.map +1 -0
- package/dist/ts/task-scheduler/index.d.ts +130 -0
- package/dist/ts/task-scheduler/index.js +259 -0
- package/dist/ts/task-scheduler/index.js.map +1 -0
- package/dist/ts/utils/index.d.ts +49 -0
- package/dist/ts/utils/index.js +157 -0
- package/dist/ts/utils/index.js.map +1 -0
- package/package.json +1 -1
- package/package.tar.gz +0 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
class SequelizePaginator {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.paginateIn = {
|
|
4
|
+
size: "page_size",
|
|
5
|
+
index: "page_index"
|
|
6
|
+
};
|
|
7
|
+
this.paginateOut = {
|
|
8
|
+
current_page: "current_page",
|
|
9
|
+
first_page: "first_page",
|
|
10
|
+
last_page: "last_page",
|
|
11
|
+
next_page: "next_page",
|
|
12
|
+
out_of_bounds: "out_of_bounds",
|
|
13
|
+
page_size: "page_size",
|
|
14
|
+
previous_page: "previous_page",
|
|
15
|
+
total_pages: "total_pages",
|
|
16
|
+
total_size: "total_size",
|
|
17
|
+
links: "",
|
|
18
|
+
};
|
|
19
|
+
this.zeroBasedOffset = true;
|
|
20
|
+
this.paginationHeader = "tws-pagination";
|
|
21
|
+
this.headersOnly = false;
|
|
22
|
+
this.paginationTag = "_pagination";
|
|
23
|
+
this.collectionTag = "_collection";
|
|
24
|
+
}
|
|
25
|
+
paginate(Model, resource = "") {
|
|
26
|
+
const model = Model.instance || Model;
|
|
27
|
+
const DEFAULT_PAGINATION = { limit: 15, offset: 0 };
|
|
28
|
+
let pagination = { limit: 15, offset: 0 };
|
|
29
|
+
let response = null;
|
|
30
|
+
const using = (options, resp) => {
|
|
31
|
+
response = resp;
|
|
32
|
+
let limit = DEFAULT_PAGINATION.limit;
|
|
33
|
+
let offset = DEFAULT_PAGINATION.offset;
|
|
34
|
+
if (options && options[this.paginateIn.size]) {
|
|
35
|
+
limit = parseInt(options[this.paginateIn.size]);
|
|
36
|
+
}
|
|
37
|
+
if (options && options[this.paginateIn.index]) {
|
|
38
|
+
offset = parseInt(options[this.paginateIn.index]);
|
|
39
|
+
}
|
|
40
|
+
if (!Number.isInteger(limit) || limit < 1) {
|
|
41
|
+
limit = 1;
|
|
42
|
+
}
|
|
43
|
+
if (!Number.isInteger(offset) || offset < 0) {
|
|
44
|
+
offset = 0;
|
|
45
|
+
}
|
|
46
|
+
if (!this.zeroBasedOffset) {
|
|
47
|
+
offset = offset <= 1 ? 0 : offset - 1;
|
|
48
|
+
}
|
|
49
|
+
pagination.limit = limit;
|
|
50
|
+
pagination.offset = offset;
|
|
51
|
+
return model;
|
|
52
|
+
};
|
|
53
|
+
const paginate = (options = {}) => {
|
|
54
|
+
options.limit = pagination.limit;
|
|
55
|
+
options.offset = pagination.limit * pagination.offset;
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
model.findAndCountAll(options)
|
|
58
|
+
.then((r) => {
|
|
59
|
+
const paginationData = getPaginationData(r);
|
|
60
|
+
if (response) {
|
|
61
|
+
response.set(this.paginationHeader, JSON.stringify(paginationData));
|
|
62
|
+
}
|
|
63
|
+
let data = {};
|
|
64
|
+
if (this.headersOnly) {
|
|
65
|
+
data = r.rows;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
data[this.paginationTag] = addLinks(paginationData);
|
|
69
|
+
data[this.collectionTag] = r.rows;
|
|
70
|
+
}
|
|
71
|
+
resolve(data);
|
|
72
|
+
}).catch((e) => reject(e));
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const addLinks = (data) => {
|
|
76
|
+
let linksKey = null;
|
|
77
|
+
if (this.paginateOut.links === true) {
|
|
78
|
+
linksKey = "links";
|
|
79
|
+
}
|
|
80
|
+
else if (this.paginateOut.links) {
|
|
81
|
+
linksKey = this.paginateOut.links;
|
|
82
|
+
}
|
|
83
|
+
if (data && linksKey && !data[this.paginateOut.out_of_bounds]) {
|
|
84
|
+
const links = {};
|
|
85
|
+
const firstPageIndex = this.zeroBasedOffset ? 0 : 1;
|
|
86
|
+
const lastPageIndex = this.zeroBasedOffset ? data[this.paginateOut.total_pages] - 1 : data[this.paginateOut.total_pages];
|
|
87
|
+
links[this.paginateOut.first_page] = `${resource}?${this.paginateIn.index}=${firstPageIndex}&${this.paginateIn.size}=${data[this.paginateOut.page_size]}`;
|
|
88
|
+
links[this.paginateOut.last_page] = `${resource}?${this.paginateIn.index}=${lastPageIndex}&${this.paginateIn.size}=${data[this.paginateOut.page_size]}`;
|
|
89
|
+
if (data[this.paginateOut.previous_page]) {
|
|
90
|
+
const prevPageIndex = this.zeroBasedOffset ? data[this.paginateOut.previous_page] - 1 : data[this.paginateOut.previous_page];
|
|
91
|
+
links[this.paginateOut.previous_page] = `${resource}?${this.paginateIn.index}=${prevPageIndex}&${this.paginateIn.size}=${data[this.paginateOut.page_size]}`;
|
|
92
|
+
}
|
|
93
|
+
if (data[this.paginateOut.next_page]) {
|
|
94
|
+
const nextPageIndex = this.zeroBasedOffset ? data[this.paginateOut.next_page] - 1 : data[this.paginateOut.next_page];
|
|
95
|
+
links[this.paginateOut.next_page] = `${resource}?${this.paginateIn.index}=${nextPageIndex}&${this.paginateIn.size}=${data[this.paginateOut.page_size]}`;
|
|
96
|
+
}
|
|
97
|
+
data[linksKey] = links;
|
|
98
|
+
}
|
|
99
|
+
return data;
|
|
100
|
+
};
|
|
101
|
+
const getPaginationData = (result) => {
|
|
102
|
+
const totalSize = result.count;
|
|
103
|
+
const pageSize = pagination.limit;
|
|
104
|
+
const currentPage = Math.floor(pagination.offset / pageSize) + 1;
|
|
105
|
+
const totalPages = Math.ceil(totalSize / pageSize);
|
|
106
|
+
const outOfBounds = currentPage > totalPages || currentPage < 1;
|
|
107
|
+
const paginationData = {
|
|
108
|
+
[this.paginateOut.current_page]: currentPage,
|
|
109
|
+
[this.paginateOut.first_page]: currentPage === 1,
|
|
110
|
+
[this.paginateOut.last_page]: currentPage === totalPages,
|
|
111
|
+
[this.paginateOut.out_of_bounds]: outOfBounds,
|
|
112
|
+
[this.paginateOut.page_size]: pageSize,
|
|
113
|
+
[this.paginateOut.total_pages]: totalPages,
|
|
114
|
+
[this.paginateOut.total_size]: totalSize,
|
|
115
|
+
};
|
|
116
|
+
if (!outOfBounds) {
|
|
117
|
+
if (currentPage > 1) {
|
|
118
|
+
paginationData[this.paginateOut.previous_page] = currentPage - 1;
|
|
119
|
+
}
|
|
120
|
+
if (currentPage < totalPages) {
|
|
121
|
+
paginationData[this.paginateOut.next_page] = currentPage + 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return paginationData;
|
|
125
|
+
};
|
|
126
|
+
return {
|
|
127
|
+
using,
|
|
128
|
+
paginate
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
configure(options) {
|
|
132
|
+
if (options.paginateIn) {
|
|
133
|
+
this.paginateIn = { ...this.paginateIn, ...options.paginateIn };
|
|
134
|
+
}
|
|
135
|
+
if (options.paginateOut) {
|
|
136
|
+
this.paginateOut = { ...this.paginateOut, ...options.paginateOut };
|
|
137
|
+
}
|
|
138
|
+
if (options.zeroBasedOffset !== undefined) {
|
|
139
|
+
this.zeroBasedOffset = options.zeroBasedOffset;
|
|
140
|
+
}
|
|
141
|
+
if (options.paginationHeader) {
|
|
142
|
+
this.paginationHeader = options.paginationHeader;
|
|
143
|
+
}
|
|
144
|
+
if (options.headersOnly !== undefined) {
|
|
145
|
+
this.headersOnly = options.headersOnly;
|
|
146
|
+
}
|
|
147
|
+
if (options.paginationTag) {
|
|
148
|
+
this.paginationTag = options.paginationTag;
|
|
149
|
+
}
|
|
150
|
+
if (options.collectionTag) {
|
|
151
|
+
this.collectionTag = options.collectionTag;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const sqlPaginator = new SequelizePaginator();
|
|
156
|
+
export default sqlPaginator;
|
|
157
|
+
//# sourceMappingURL=sql-pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-pagination.js","sourceRoot":"","sources":["../../../ts/paginator/sql-pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface DiffResult {
|
|
2
|
+
kind: string;
|
|
3
|
+
path: string[];
|
|
4
|
+
lhs?: any;
|
|
5
|
+
rhs?: any;
|
|
6
|
+
}
|
|
7
|
+
declare const _default: {
|
|
8
|
+
capitalizeFirstLetter: (string: string) => string;
|
|
9
|
+
toUnderscored: (obj: Record<string, string>) => Record<string, string>;
|
|
10
|
+
calcDelta: (current: Record<string, any>, next: Record<string, any>, exclude: string[], strict: boolean, DEBUG?: boolean) => DiffResult[] | null;
|
|
11
|
+
diffToString: (val: any) => string;
|
|
12
|
+
};
|
|
13
|
+
export default _default;
|
|
14
|
+
export type { DiffResult };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import pkg from 'deep-diff';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
const { diff } = pkg;
|
|
4
|
+
const capitalizeFirstLetter = (string) => string.charAt(0).toUpperCase() + string.slice(1);
|
|
5
|
+
const toUnderscored = (obj) => {
|
|
6
|
+
_.forEach(obj, (k, v) => {
|
|
7
|
+
obj[k] = v
|
|
8
|
+
.replace(/(?:^|\.?)([A-Z])/g, (x, y) => `_${y.toLowerCase()}`)
|
|
9
|
+
.replace(/^_/, '');
|
|
10
|
+
});
|
|
11
|
+
return obj;
|
|
12
|
+
};
|
|
13
|
+
const calcDelta = (current, next, exclude, strict, DEBUG = false) => {
|
|
14
|
+
if (DEBUG) {
|
|
15
|
+
console.log('current', current);
|
|
16
|
+
console.log('next', next);
|
|
17
|
+
console.log('exclude', exclude);
|
|
18
|
+
}
|
|
19
|
+
const di = diff(current, next);
|
|
20
|
+
if (DEBUG) {
|
|
21
|
+
console.log('di', di);
|
|
22
|
+
let diffs2 = [];
|
|
23
|
+
if (di) {
|
|
24
|
+
diffs2 = di.map((i) => JSON.parse(JSON.stringify(i).replace('"__data",', '')));
|
|
25
|
+
}
|
|
26
|
+
console.log('diffs2', diffs2);
|
|
27
|
+
console.log('filter1', diffs2.filter(i => i.path.join(',').indexOf('_') === -1));
|
|
28
|
+
console.log('filter2', diffs2.filter(i => exclude.every(x => i.path.indexOf(x) === -1)));
|
|
29
|
+
}
|
|
30
|
+
let diffs = [];
|
|
31
|
+
if (di) {
|
|
32
|
+
diffs = di
|
|
33
|
+
.map((i) => JSON.parse(JSON.stringify(i).replace('"__data",', '')))
|
|
34
|
+
.filter((i) => {
|
|
35
|
+
if (!strict && i.kind === 'E') {
|
|
36
|
+
// eslint-disable-next-line eqeqeq
|
|
37
|
+
if (i.lhs != i.rhs)
|
|
38
|
+
return i;
|
|
39
|
+
}
|
|
40
|
+
else
|
|
41
|
+
return i;
|
|
42
|
+
return false;
|
|
43
|
+
})
|
|
44
|
+
.filter((i) => exclude.every((x) => i.path.indexOf(x) === -1));
|
|
45
|
+
}
|
|
46
|
+
if (diffs.length > 0) {
|
|
47
|
+
return diffs;
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
};
|
|
51
|
+
const diffToString = (val) => {
|
|
52
|
+
if (typeof val === 'undefined' || val === null)
|
|
53
|
+
return '';
|
|
54
|
+
if (val === true)
|
|
55
|
+
return '1';
|
|
56
|
+
if (val === false)
|
|
57
|
+
return '0';
|
|
58
|
+
if (typeof val === 'string')
|
|
59
|
+
return val;
|
|
60
|
+
if (!Number.isNaN(Number(val)))
|
|
61
|
+
return `${String(val)}`;
|
|
62
|
+
if ((typeof val === 'undefined' ? 'undefined' : typeof val) === 'object')
|
|
63
|
+
return `${JSON.stringify(val)}`;
|
|
64
|
+
if (Array.isArray(val))
|
|
65
|
+
return `${JSON.stringify(val)}`;
|
|
66
|
+
return '';
|
|
67
|
+
};
|
|
68
|
+
export default {
|
|
69
|
+
capitalizeFirstLetter,
|
|
70
|
+
toUnderscored,
|
|
71
|
+
calcDelta,
|
|
72
|
+
diffToString
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../ts/paper-trail/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
interface PaperTrailOptions {
|
|
2
|
+
debug?: boolean;
|
|
3
|
+
log?: any;
|
|
4
|
+
exclude?: string[];
|
|
5
|
+
excludeExtras?: string[];
|
|
6
|
+
excludeVirtualAttributes?: boolean;
|
|
7
|
+
censor?: string[];
|
|
8
|
+
revisionAttribute?: string;
|
|
9
|
+
revisionModel?: string;
|
|
10
|
+
revisionChangeModel?: string;
|
|
11
|
+
enableRevisionChangeModel?: boolean;
|
|
12
|
+
UUID?: boolean;
|
|
13
|
+
mixedDocumentReference?: boolean;
|
|
14
|
+
underscored?: boolean;
|
|
15
|
+
underscoredAttributes?: boolean;
|
|
16
|
+
includeReferences?: string[];
|
|
17
|
+
defaultAttributes?: {
|
|
18
|
+
documentId: string;
|
|
19
|
+
revisionId: string;
|
|
20
|
+
autoGenerated: string;
|
|
21
|
+
documentUuid?: string;
|
|
22
|
+
};
|
|
23
|
+
als?: any;
|
|
24
|
+
userModel?: boolean;
|
|
25
|
+
userModelAttribute?: string;
|
|
26
|
+
tenantModel?: boolean;
|
|
27
|
+
tenantModelAttribute?: string;
|
|
28
|
+
enableCompression?: boolean;
|
|
29
|
+
enableMigration?: boolean;
|
|
30
|
+
enableStrictDiff?: boolean;
|
|
31
|
+
continuationNamespace?: any;
|
|
32
|
+
continuationKey?: string;
|
|
33
|
+
continuationTenantKey?: string;
|
|
34
|
+
metaDataFields?: any;
|
|
35
|
+
metaDataContinuationKey?: string;
|
|
36
|
+
mysql?: boolean;
|
|
37
|
+
}
|
|
38
|
+
interface ModelInstance {
|
|
39
|
+
get: (key?: string) => Record<string, any> | any;
|
|
40
|
+
set: (key: string, value: any) => void;
|
|
41
|
+
save: () => Promise<any>;
|
|
42
|
+
[key: string]: any;
|
|
43
|
+
}
|
|
44
|
+
interface ModelOptions {
|
|
45
|
+
noPaperTrail?: boolean;
|
|
46
|
+
[key: string]: any;
|
|
47
|
+
}
|
|
48
|
+
declare const paperTrail: {
|
|
49
|
+
init: (sequelize: any, sequelizePackage: any, optionsArg?: PaperTrailOptions) => void;
|
|
50
|
+
hasPaperTrail: () => boolean;
|
|
51
|
+
defineModels: (db: any) => void;
|
|
52
|
+
};
|
|
53
|
+
export default paperTrail;
|
|
54
|
+
export type { PaperTrailOptions, ModelInstance, ModelOptions };
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import helpers from './helpers.js';
|
|
3
|
+
const censorText = "**********";
|
|
4
|
+
let failHard = false;
|
|
5
|
+
let Sequelize = null;
|
|
6
|
+
const paperTrail = {
|
|
7
|
+
init: (sequelize, sequelizePackage, optionsArg) => {
|
|
8
|
+
Sequelize = sequelizePackage;
|
|
9
|
+
// In case that options is being parsed as a readonly attribute.
|
|
10
|
+
// Or it is not passed at all
|
|
11
|
+
const optsArg = _.cloneDeep(optionsArg || {});
|
|
12
|
+
const defaultOptions = {
|
|
13
|
+
debug: false,
|
|
14
|
+
log: null,
|
|
15
|
+
exclude: [
|
|
16
|
+
'id',
|
|
17
|
+
'createdAt',
|
|
18
|
+
'updatedAt',
|
|
19
|
+
'deletedAt',
|
|
20
|
+
'created_at',
|
|
21
|
+
'updated_at',
|
|
22
|
+
'deleted_at',
|
|
23
|
+
'audit_source',
|
|
24
|
+
'revision',
|
|
25
|
+
],
|
|
26
|
+
// additional fields to exclude on a global basis
|
|
27
|
+
excludeExtras: [],
|
|
28
|
+
excludeVirtualAttributes: true, // by default do not record these
|
|
29
|
+
censor: ["password", "password_salt", "temp_secret", "mfa_totp_secret"],
|
|
30
|
+
revisionAttribute: 'revision',
|
|
31
|
+
revisionModel: 'Revision',
|
|
32
|
+
revisionChangeModel: 'RevisionChange',
|
|
33
|
+
enableRevisionChangeModel: false,
|
|
34
|
+
UUID: false,
|
|
35
|
+
// does this project use int's and UUIDs for some references (postgres)
|
|
36
|
+
mixedDocumentReference: false,
|
|
37
|
+
underscored: false,
|
|
38
|
+
underscoredAttributes: false,
|
|
39
|
+
// always store these keys in a reference value if seen
|
|
40
|
+
includeReferences: [],
|
|
41
|
+
defaultAttributes: {
|
|
42
|
+
documentId: 'documentId',
|
|
43
|
+
revisionId: 'revisionId',
|
|
44
|
+
autoGenerated: 'autoGenerated'
|
|
45
|
+
},
|
|
46
|
+
als: null,
|
|
47
|
+
userModel: false,
|
|
48
|
+
userModelAttribute: 'userId',
|
|
49
|
+
tenantModel: false,
|
|
50
|
+
tenantModelAttribute: 'tenantId',
|
|
51
|
+
enableCompression: false,
|
|
52
|
+
enableMigration: false,
|
|
53
|
+
enableStrictDiff: true,
|
|
54
|
+
continuationNamespace: null,
|
|
55
|
+
continuationKey: 'userId',
|
|
56
|
+
continuationTenantKey: 'tenantId',
|
|
57
|
+
metaDataFields: null,
|
|
58
|
+
metaDataContinuationKey: 'metaData',
|
|
59
|
+
mysql: false,
|
|
60
|
+
};
|
|
61
|
+
if (optsArg.mixedDocumentReference)
|
|
62
|
+
defaultOptions.defaultAttributes.documentUuid = "documentUuid";
|
|
63
|
+
if (optsArg.underscoredAttributes) {
|
|
64
|
+
helpers.toUnderscored(defaultOptions.defaultAttributes);
|
|
65
|
+
}
|
|
66
|
+
// deals with not wanting to overwrite the initial ones, just add some
|
|
67
|
+
if (optsArg.excludeExtras) {
|
|
68
|
+
if (optsArg.exclude) {
|
|
69
|
+
optsArg.exclude = [...optsArg.exclude, ...optsArg.excludeExtras];
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
optsArg.exclude = [...defaultOptions.exclude, ...optsArg.excludeExtras];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const options = _.defaults(optsArg, defaultOptions);
|
|
76
|
+
const log = options.log || console.log;
|
|
77
|
+
function createBeforeHook(operation) {
|
|
78
|
+
const beforeHook = function beforeHook(instance, opt) {
|
|
79
|
+
if (options.debug) {
|
|
80
|
+
log('beforeHook called');
|
|
81
|
+
log('instance:', instance);
|
|
82
|
+
log('opt:', opt);
|
|
83
|
+
}
|
|
84
|
+
if (opt.noPaperTrail) {
|
|
85
|
+
if (options.debug) {
|
|
86
|
+
log('noPaperTrail set, skipping');
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Store the original values for comparison
|
|
91
|
+
const originalValues = instance.get();
|
|
92
|
+
instance.set('_paperTrailOriginalValues', originalValues);
|
|
93
|
+
};
|
|
94
|
+
return beforeHook;
|
|
95
|
+
}
|
|
96
|
+
function createAfterHook(operation) {
|
|
97
|
+
const afterHook = function afterHook(instance, opt) {
|
|
98
|
+
if (options.debug) {
|
|
99
|
+
log('afterHook called');
|
|
100
|
+
log('instance:', instance);
|
|
101
|
+
log('opt:', opt);
|
|
102
|
+
}
|
|
103
|
+
if (opt.noPaperTrail) {
|
|
104
|
+
if (options.debug) {
|
|
105
|
+
log('noPaperTrail set, skipping');
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Get the original values and current values
|
|
110
|
+
const originalValues = instance.get('_paperTrailOriginalValues') || {};
|
|
111
|
+
const currentValues = instance.get();
|
|
112
|
+
// Remove the temporary field
|
|
113
|
+
delete currentValues._paperTrailOriginalValues;
|
|
114
|
+
// Calculate differences
|
|
115
|
+
const differences = helpers.calcDelta(originalValues, currentValues, options.exclude || [], options.enableStrictDiff || false, options.debug);
|
|
116
|
+
if (differences && differences.length > 0) {
|
|
117
|
+
// Create revision record
|
|
118
|
+
const revisionData = {
|
|
119
|
+
documentId: instance.get(options.defaultAttributes.documentId),
|
|
120
|
+
revision: instance.get(options.revisionAttribute),
|
|
121
|
+
document: JSON.stringify(currentValues),
|
|
122
|
+
operation: operation,
|
|
123
|
+
changes: JSON.stringify(differences),
|
|
124
|
+
createdAt: new Date()
|
|
125
|
+
};
|
|
126
|
+
// Add user information if available
|
|
127
|
+
if (options.userModel && options.als) {
|
|
128
|
+
const user = options.als.get(options.continuationKey);
|
|
129
|
+
if (user) {
|
|
130
|
+
revisionData[options.userModelAttribute] = user;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Add tenant information if available
|
|
134
|
+
if (options.tenantModel && options.als) {
|
|
135
|
+
const tenant = options.als.get(options.continuationTenantKey);
|
|
136
|
+
if (tenant) {
|
|
137
|
+
revisionData[options.tenantModelAttribute] = tenant;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Save revision
|
|
141
|
+
const Revision = sequelize.models[options.revisionModel];
|
|
142
|
+
if (Revision) {
|
|
143
|
+
Revision.create(revisionData).catch((err) => {
|
|
144
|
+
if (failHard) {
|
|
145
|
+
throw err;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
log('Error creating revision:', err);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
return afterHook;
|
|
155
|
+
}
|
|
156
|
+
// Add hooks to all models
|
|
157
|
+
Object.keys(sequelize.models).forEach(modelName => {
|
|
158
|
+
const model = sequelize.models[modelName];
|
|
159
|
+
// Add before hooks
|
|
160
|
+
model.addHook('beforeCreate', createBeforeHook('create'));
|
|
161
|
+
model.addHook('beforeUpdate', createBeforeHook('update'));
|
|
162
|
+
model.addHook('beforeDestroy', createBeforeHook('destroy'));
|
|
163
|
+
// Add after hooks
|
|
164
|
+
model.addHook('afterCreate', createAfterHook('create'));
|
|
165
|
+
model.addHook('afterUpdate', createAfterHook('update'));
|
|
166
|
+
model.addHook('afterDestroy', createAfterHook('destroy'));
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
hasPaperTrail: function hasPaperTrail() {
|
|
170
|
+
return Sequelize !== null;
|
|
171
|
+
},
|
|
172
|
+
defineModels: function defineModels(db) {
|
|
173
|
+
if (!Sequelize) {
|
|
174
|
+
throw new Error('PaperTrail not initialized. Call paperTrail.init() first.');
|
|
175
|
+
}
|
|
176
|
+
const Revision = db.define('Revision', {
|
|
177
|
+
id: {
|
|
178
|
+
type: Sequelize.INTEGER,
|
|
179
|
+
primaryKey: true,
|
|
180
|
+
autoIncrement: true
|
|
181
|
+
},
|
|
182
|
+
documentId: {
|
|
183
|
+
type: Sequelize.STRING,
|
|
184
|
+
allowNull: false
|
|
185
|
+
},
|
|
186
|
+
revision: {
|
|
187
|
+
type: Sequelize.INTEGER,
|
|
188
|
+
allowNull: false
|
|
189
|
+
},
|
|
190
|
+
document: {
|
|
191
|
+
type: Sequelize.TEXT,
|
|
192
|
+
allowNull: false
|
|
193
|
+
},
|
|
194
|
+
operation: {
|
|
195
|
+
type: Sequelize.STRING,
|
|
196
|
+
allowNull: false
|
|
197
|
+
},
|
|
198
|
+
changes: {
|
|
199
|
+
type: Sequelize.TEXT,
|
|
200
|
+
allowNull: true
|
|
201
|
+
},
|
|
202
|
+
userId: {
|
|
203
|
+
type: Sequelize.INTEGER,
|
|
204
|
+
allowNull: true
|
|
205
|
+
},
|
|
206
|
+
tenantId: {
|
|
207
|
+
type: Sequelize.INTEGER,
|
|
208
|
+
allowNull: true
|
|
209
|
+
},
|
|
210
|
+
createdAt: {
|
|
211
|
+
type: Sequelize.DATE,
|
|
212
|
+
allowNull: false
|
|
213
|
+
}
|
|
214
|
+
}, {
|
|
215
|
+
tableName: 'revisions',
|
|
216
|
+
timestamps: false
|
|
217
|
+
});
|
|
218
|
+
// Add associations if user and tenant models exist
|
|
219
|
+
if (db.models.User) {
|
|
220
|
+
Revision.belongsTo(db.models.User, { foreignKey: 'userId' });
|
|
221
|
+
}
|
|
222
|
+
if (db.models.Tenant) {
|
|
223
|
+
Revision.belongsTo(db.models.Tenant, { foreignKey: 'tenantId' });
|
|
224
|
+
}
|
|
225
|
+
Revision.associate = function associate(models) {
|
|
226
|
+
if (models.User) {
|
|
227
|
+
Revision.belongsTo(models.User, { foreignKey: 'userId' });
|
|
228
|
+
}
|
|
229
|
+
if (models.Tenant) {
|
|
230
|
+
Revision.belongsTo(models.Tenant, { foreignKey: 'tenantId' });
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
export default paperTrail;
|
|
236
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../ts/paper-trail/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ArgumentParser } from 'argparse';
|
|
2
|
+
interface CLIInitOptions {
|
|
3
|
+
asyncFcns?: (() => Promise<void>)[];
|
|
4
|
+
extraFcns?: (() => void)[];
|
|
5
|
+
sleepTime?: number;
|
|
6
|
+
}
|
|
7
|
+
interface PromptOptions {
|
|
8
|
+
[key: string]: {
|
|
9
|
+
type: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
required?: boolean;
|
|
12
|
+
default?: any;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
declare const setupCLIParser: (description: string) => ArgumentParser;
|
|
16
|
+
declare const commonCLIInit: (options?: CLIInitOptions) => Promise<void>;
|
|
17
|
+
declare const promptCLIAsync: (options: PromptOptions) => Promise<Record<string, any>>;
|
|
18
|
+
declare const waitCLIPrompt: PromptOptions;
|
|
19
|
+
declare const continueCLIPrompt: PromptOptions;
|
|
20
|
+
declare const cliSleep: (ms: number) => Promise<void>;
|
|
21
|
+
export { commonCLIInit, continueCLIPrompt, promptCLIAsync, setupCLIParser, cliSleep, waitCLIPrompt, type CLIInitOptions, type PromptOptions };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/* Essentia Common Prompt Functions */
|
|
2
|
+
// This file contains common prompt functions that are used in CLI scripts
|
|
3
|
+
// that are run in the each project. These functions are used to
|
|
4
|
+
// prompt the user for input and to wait for the user to press enter
|
|
5
|
+
// before continuing. This is useful for scripts that are run in the
|
|
6
|
+
// command line and need to wait for the user to do something before
|
|
7
|
+
// continuing.
|
|
8
|
+
import { S4Logger } from "../logger/s4-logger.js";
|
|
9
|
+
import { ArgumentParser } from 'argparse';
|
|
10
|
+
import prompt from "prompt";
|
|
11
|
+
const logger = new S4Logger();
|
|
12
|
+
// New common argument parser which makes parsing and setting up commandline options easier
|
|
13
|
+
const setupCLIParser = (description) => {
|
|
14
|
+
logger.info(description);
|
|
15
|
+
return new ArgumentParser({ description });
|
|
16
|
+
};
|
|
17
|
+
// a common init function which waits for the command prompt to be delivered
|
|
18
|
+
// a common use is for the awaiting of the queues to initialize before running
|
|
19
|
+
const commonCLIInit = async (options = {}) => {
|
|
20
|
+
//add in defaults to options if they have not been specified or object is {}
|
|
21
|
+
const defaultOptions = {
|
|
22
|
+
asyncFcns: [],
|
|
23
|
+
extraFcns: [],
|
|
24
|
+
sleepTime: 1000,
|
|
25
|
+
...options
|
|
26
|
+
};
|
|
27
|
+
// Sleep for 1 second to allow the prompt to be displayed
|
|
28
|
+
// at the end of bootstrap logs
|
|
29
|
+
await cliSleep(defaultOptions.sleepTime);
|
|
30
|
+
defaultOptions.extraFcns.forEach(fcn => {
|
|
31
|
+
fcn();
|
|
32
|
+
});
|
|
33
|
+
for (const fcn of defaultOptions.asyncFcns) {
|
|
34
|
+
await fcn();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const promptCLIAsync = async (options) => {
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
prompt.start();
|
|
40
|
+
prompt.get(options, (err, res) => {
|
|
41
|
+
if (err) {
|
|
42
|
+
reject(err);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
resolve(res);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
// A predefined waitPrompt for use at the end of the scripts that use
|
|
51
|
+
// message queues. Message Queues often take a bit to fire
|
|
52
|
+
const waitCLIPrompt = {
|
|
53
|
+
"Push <enter> when done": {
|
|
54
|
+
type: "boolean"
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const continueCLIPrompt = {
|
|
58
|
+
"Push <enter> to continue": {
|
|
59
|
+
type: "boolean"
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const cliSleep = async (ms) => {
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
setTimeout(resolve, ms);
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
export { commonCLIInit, continueCLIPrompt, promptCLIAsync, setupCLIParser, cliSleep, waitCLIPrompt };
|
|
68
|
+
//# sourceMappingURL=index.js.map
|