@sera4/essentia 3.0.13 → 3.1.0-rc.1

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.
Files changed (91) hide show
  1. package/README.md +93 -308
  2. package/dist/ts/cache/index.d.ts +33 -0
  3. package/dist/ts/cache/index.js +175 -0
  4. package/dist/ts/cache/index.js.map +1 -0
  5. package/dist/ts/configurations/server-config.d.ts +4 -0
  6. package/dist/ts/configurations/server-config.js +2 -0
  7. package/dist/ts/configurations/server-config.js.map +1 -0
  8. package/dist/ts/constants/index.d.ts +7 -0
  9. package/dist/ts/constants/index.js +8 -0
  10. package/dist/ts/constants/index.js.map +1 -0
  11. package/dist/ts/cycle/index.d.ts +53 -0
  12. package/dist/ts/cycle/index.js +171 -0
  13. package/dist/ts/cycle/index.js.map +1 -0
  14. package/dist/ts/dns/dns-cache.d.ts +50 -0
  15. package/dist/ts/dns/dns-cache.js +144 -0
  16. package/dist/ts/dns/dns-cache.js.map +1 -0
  17. package/dist/ts/dns/index.d.ts +4 -0
  18. package/dist/ts/dns/index.js +4 -0
  19. package/dist/ts/dns/index.js.map +1 -0
  20. package/dist/ts/formatter/index.d.ts +45 -0
  21. package/dist/ts/formatter/index.js +82 -0
  22. package/dist/ts/formatter/index.js.map +1 -0
  23. package/dist/ts/hal/index.d.ts +26 -0
  24. package/dist/ts/hal/index.js +70 -0
  25. package/dist/ts/hal/index.js.map +1 -0
  26. package/dist/ts/health/index.d.ts +52 -0
  27. package/dist/ts/health/index.js +170 -0
  28. package/dist/ts/health/index.js.map +1 -0
  29. package/dist/ts/helpers/index.d.ts +1 -0
  30. package/dist/ts/helpers/index.js +2 -0
  31. package/dist/ts/helpers/index.js.map +1 -0
  32. package/dist/ts/helpers/test-server-wrapper.d.ts +56 -0
  33. package/dist/ts/helpers/test-server-wrapper.js +153 -0
  34. package/dist/ts/helpers/test-server-wrapper.js.map +1 -0
  35. package/{index.js → dist/ts/index.d.ts} +14 -11
  36. package/dist/ts/index.js +25 -0
  37. package/dist/ts/index.js.map +1 -0
  38. package/dist/ts/last-commit/index.d.ts +12 -0
  39. package/dist/ts/last-commit/index.js +82 -0
  40. package/dist/ts/last-commit/index.js.map +1 -0
  41. package/dist/ts/logger/index.d.ts +4 -0
  42. package/dist/ts/logger/index.js +5 -0
  43. package/dist/ts/logger/index.js.map +1 -0
  44. package/dist/ts/logger/s4-logger.d.ts +41 -0
  45. package/dist/ts/logger/s4-logger.js +134 -0
  46. package/dist/ts/logger/s4-logger.js.map +1 -0
  47. package/dist/ts/paginator/index.d.ts +2 -0
  48. package/dist/ts/paginator/index.js +3 -0
  49. package/dist/ts/paginator/index.js.map +1 -0
  50. package/dist/ts/paginator/s4-pagination.d.ts +28 -0
  51. package/dist/ts/paginator/s4-pagination.js +49 -0
  52. package/dist/ts/paginator/s4-pagination.js.map +1 -0
  53. package/dist/ts/paginator/sql-pagination.d.ts +52 -0
  54. package/dist/ts/paginator/sql-pagination.js +176 -0
  55. package/dist/ts/paginator/sql-pagination.js.map +1 -0
  56. package/dist/ts/paper-trail/helpers.d.ts +14 -0
  57. package/dist/ts/paper-trail/helpers.js +72 -0
  58. package/dist/ts/paper-trail/helpers.js.map +1 -0
  59. package/dist/ts/paper-trail/index.d.ts +54 -0
  60. package/dist/ts/paper-trail/index.js +235 -0
  61. package/dist/ts/paper-trail/index.js.map +1 -0
  62. package/dist/ts/prompts/index.d.ts +21 -0
  63. package/dist/ts/prompts/index.js +68 -0
  64. package/dist/ts/prompts/index.js.map +1 -0
  65. package/dist/ts/queue/index.d.ts +232 -0
  66. package/dist/ts/queue/index.js +446 -0
  67. package/dist/ts/queue/index.js.map +1 -0
  68. package/dist/ts/queue/publisher.d.ts +41 -0
  69. package/dist/ts/queue/publisher.js +87 -0
  70. package/dist/ts/queue/publisher.js.map +1 -0
  71. package/dist/ts/queue/queue-logger.d.ts +10 -0
  72. package/dist/ts/queue/queue-logger.js +35 -0
  73. package/dist/ts/queue/queue-logger.js.map +1 -0
  74. package/dist/ts/queue/subscriber.d.ts +55 -0
  75. package/dist/ts/queue/subscriber.js +104 -0
  76. package/dist/ts/queue/subscriber.js.map +1 -0
  77. package/dist/ts/safe-proxy/index.d.ts +24 -0
  78. package/dist/ts/safe-proxy/index.js +50 -0
  79. package/dist/ts/safe-proxy/index.js.map +1 -0
  80. package/dist/ts/serializer/index.d.ts +52 -0
  81. package/dist/ts/serializer/index.js +83 -0
  82. package/dist/ts/serializer/index.js.map +1 -0
  83. package/dist/ts/task-scheduler/index.d.ts +130 -0
  84. package/dist/ts/task-scheduler/index.js +261 -0
  85. package/dist/ts/task-scheduler/index.js.map +1 -0
  86. package/dist/ts/utils/index.d.ts +49 -0
  87. package/dist/ts/utils/index.js +162 -0
  88. package/dist/ts/utils/index.js.map +1 -0
  89. package/last-commit.ts +12 -0
  90. package/package.json +28 -11
  91. package/package.tar.gz +0 -0
@@ -0,0 +1,72 @@
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.replace(/(?:^|\.?)([A-Z])/g, (_x, y) => `_${y.toLowerCase()}`).replace(/^_/, "");
8
+ });
9
+ return obj;
10
+ };
11
+ const calcDelta = (current, next, exclude, strict, DEBUG = false) => {
12
+ if (DEBUG) {
13
+ console.log("current", current);
14
+ console.log("next", next);
15
+ console.log("exclude", exclude);
16
+ }
17
+ const di = diff(current, next);
18
+ if (DEBUG) {
19
+ console.log("di", di);
20
+ let diffs2 = [];
21
+ if (di) {
22
+ diffs2 = di.map((i) => JSON.parse(JSON.stringify(i).replace('"__data",', "")));
23
+ }
24
+ console.log("diffs2", diffs2);
25
+ console.log("filter1", diffs2.filter((i) => i.path.join(",").indexOf("_") === -1));
26
+ console.log("filter2", diffs2.filter((i) => exclude.every((x) => i.path.indexOf(x) === -1)));
27
+ }
28
+ let diffs = [];
29
+ if (di) {
30
+ diffs = di
31
+ .map((i) => JSON.parse(JSON.stringify(i).replace('"__data",', "")))
32
+ .filter((i) => {
33
+ if (!strict && i.kind === "E") {
34
+ // biome-ignore lint/suspicious/noDoubleEquals: intentional loose equality for non-strict mode
35
+ if (i.lhs != i.rhs)
36
+ return i;
37
+ }
38
+ else
39
+ return i;
40
+ return false;
41
+ })
42
+ .filter((i) => exclude.every((x) => i.path.indexOf(x) === -1));
43
+ }
44
+ if (diffs.length > 0) {
45
+ return diffs;
46
+ }
47
+ return null;
48
+ };
49
+ const diffToString = (val) => {
50
+ if (typeof val === "undefined" || val === null)
51
+ return "";
52
+ if (val === true)
53
+ return "1";
54
+ if (val === false)
55
+ return "0";
56
+ if (typeof val === "string")
57
+ return val;
58
+ if (!Number.isNaN(Number(val)))
59
+ return `${String(val)}`;
60
+ if ((typeof val === "undefined" ? "undefined" : typeof val) === "object")
61
+ return `${JSON.stringify(val)}`;
62
+ if (Array.isArray(val))
63
+ return `${JSON.stringify(val)}`;
64
+ return "";
65
+ };
66
+ export default {
67
+ capitalizeFirstLetter,
68
+ toUnderscored,
69
+ calcDelta,
70
+ diffToString,
71
+ };
72
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../ts/paper-trail/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAC5B,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;AASrB,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE3G,MAAM,aAAa,GAAG,CAAC,GAA2B,EAA0B,EAAE;IAC5E,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE;QAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,EAAO,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAChB,OAA4B,EAC5B,IAAyB,EACzB,OAAiB,EACjB,MAAe,EACf,QAAiB,KAAK,EACD,EAAE;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE/B,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEtB,IAAI,MAAM,GAAiB,EAAE,CAAC;QAC9B,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACtF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE9B,OAAO,CAAC,GAAG,CACT,SAAS,EACT,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3D,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,SAAS,EACT,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACrE,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,GAAiB,EAAE,CAAC;IAC7B,IAAI,EAAE,EAAE,CAAC;QACP,KAAK,GAAG,EAAE;aACP,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;aACvE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE;YACjB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBAC9B,8FAA8F;gBAC9F,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG;oBAAE,OAAO,CAAC,CAAC;YAC/B,CAAC;;gBAAM,OAAO,CAAC,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAQ,EAAU,EAAE;IACxC,IAAI,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAE1D,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAE7B,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IAE9B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAExD,IAAI,CAAC,OAAO,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAE1G,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAExD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,eAAe;IACb,qBAAqB;IACrB,aAAa;IACb,SAAS;IACT,YAAY;CACb,CAAC"}
@@ -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 { ModelInstance, ModelOptions, PaperTrailOptions };
@@ -0,0 +1,235 @@
1
+ import _ from "lodash";
2
+ import helpers from "./helpers.js";
3
+ const failHard = false;
4
+ let Sequelize = null;
5
+ const paperTrail = {
6
+ init: (sequelize, sequelizePackage, optionsArg) => {
7
+ Sequelize = sequelizePackage;
8
+ // In case that options is being parsed as a readonly attribute.
9
+ // Or it is not passed at all
10
+ const optsArg = _.cloneDeep(optionsArg || {});
11
+ const defaultOptions = {
12
+ debug: false,
13
+ log: null,
14
+ exclude: [
15
+ "id",
16
+ "createdAt",
17
+ "updatedAt",
18
+ "deletedAt",
19
+ "created_at",
20
+ "updated_at",
21
+ "deleted_at",
22
+ "audit_source",
23
+ "revision",
24
+ ],
25
+ // additional fields to exclude on a global basis
26
+ excludeExtras: [],
27
+ excludeVirtualAttributes: true, // by default do not record these
28
+ censor: ["password", "password_salt", "temp_secret", "mfa_totp_secret"],
29
+ revisionAttribute: "revision",
30
+ revisionModel: "Revision",
31
+ revisionChangeModel: "RevisionChange",
32
+ enableRevisionChangeModel: false,
33
+ UUID: false,
34
+ // does this project use int's and UUIDs for some references (postgres)
35
+ mixedDocumentReference: false,
36
+ underscored: false,
37
+ underscoredAttributes: false,
38
+ // always store these keys in a reference value if seen
39
+ includeReferences: [],
40
+ defaultAttributes: {
41
+ documentId: "documentId",
42
+ revisionId: "revisionId",
43
+ autoGenerated: "autoGenerated",
44
+ },
45
+ als: null,
46
+ userModel: false,
47
+ userModelAttribute: "userId",
48
+ tenantModel: false,
49
+ tenantModelAttribute: "tenantId",
50
+ enableCompression: false,
51
+ enableMigration: false,
52
+ enableStrictDiff: true,
53
+ continuationNamespace: null,
54
+ continuationKey: "userId",
55
+ continuationTenantKey: "tenantId",
56
+ metaDataFields: null,
57
+ metaDataContinuationKey: "metaData",
58
+ mysql: false,
59
+ };
60
+ if (optsArg.mixedDocumentReference)
61
+ defaultOptions.defaultAttributes.documentUuid = "documentUuid";
62
+ if (optsArg.underscoredAttributes) {
63
+ helpers.toUnderscored(defaultOptions.defaultAttributes);
64
+ }
65
+ // deals with not wanting to overwrite the initial ones, just add some
66
+ if (optsArg.excludeExtras) {
67
+ if (optsArg.exclude) {
68
+ optsArg.exclude = [...optsArg.exclude, ...optsArg.excludeExtras];
69
+ }
70
+ else {
71
+ optsArg.exclude = [...defaultOptions.exclude, ...optsArg.excludeExtras];
72
+ }
73
+ }
74
+ const options = _.defaults(optsArg, defaultOptions);
75
+ const log = options.log || console.log;
76
+ function createBeforeHook(_operation) {
77
+ const beforeHook = function beforeHook(instance, opt) {
78
+ if (options.debug) {
79
+ log("beforeHook called");
80
+ log("instance:", instance);
81
+ log("opt:", opt);
82
+ }
83
+ if (opt.noPaperTrail) {
84
+ if (options.debug) {
85
+ log("noPaperTrail set, skipping");
86
+ }
87
+ return;
88
+ }
89
+ // Store the original values for comparison
90
+ const originalValues = instance.get();
91
+ instance.set("_paperTrailOriginalValues", originalValues);
92
+ };
93
+ return beforeHook;
94
+ }
95
+ function createAfterHook(operation) {
96
+ const afterHook = function afterHook(instance, opt) {
97
+ if (options.debug) {
98
+ log("afterHook called");
99
+ log("instance:", instance);
100
+ log("opt:", opt);
101
+ }
102
+ if (opt.noPaperTrail) {
103
+ if (options.debug) {
104
+ log("noPaperTrail set, skipping");
105
+ }
106
+ return;
107
+ }
108
+ // Get the original values and current values
109
+ const originalValues = instance.get("_paperTrailOriginalValues") || {};
110
+ const currentValues = instance.get();
111
+ // Remove the temporary field
112
+ delete currentValues._paperTrailOriginalValues;
113
+ // Calculate differences
114
+ const differences = helpers.calcDelta(originalValues, currentValues, options.exclude || [], options.enableStrictDiff || false, options.debug);
115
+ if (differences && differences.length > 0) {
116
+ // Create revision record
117
+ const revisionData = {
118
+ documentId: instance.get(options.defaultAttributes.documentId),
119
+ revision: instance.get(options.revisionAttribute),
120
+ document: JSON.stringify(currentValues),
121
+ operation: operation,
122
+ changes: JSON.stringify(differences),
123
+ createdAt: new Date(),
124
+ };
125
+ // Add user information if available
126
+ if (options.userModel && options.als) {
127
+ const user = options.als.get(options.continuationKey);
128
+ if (user) {
129
+ revisionData[options.userModelAttribute] = user;
130
+ }
131
+ }
132
+ // Add tenant information if available
133
+ if (options.tenantModel && options.als) {
134
+ const tenant = options.als.get(options.continuationTenantKey);
135
+ if (tenant) {
136
+ revisionData[options.tenantModelAttribute] = tenant;
137
+ }
138
+ }
139
+ // Save revision
140
+ const Revision = sequelize.models[options.revisionModel];
141
+ if (Revision) {
142
+ Revision.create(revisionData).catch((err) => {
143
+ if (failHard) {
144
+ throw err;
145
+ }
146
+ else {
147
+ log("Error creating revision:", err);
148
+ }
149
+ });
150
+ }
151
+ }
152
+ };
153
+ return afterHook;
154
+ }
155
+ // Add hooks to all models
156
+ Object.keys(sequelize.models).forEach((modelName) => {
157
+ const model = sequelize.models[modelName];
158
+ // Add before hooks
159
+ model.addHook("beforeCreate", createBeforeHook("create"));
160
+ model.addHook("beforeUpdate", createBeforeHook("update"));
161
+ model.addHook("beforeDestroy", createBeforeHook("destroy"));
162
+ // Add after hooks
163
+ model.addHook("afterCreate", createAfterHook("create"));
164
+ model.addHook("afterUpdate", createAfterHook("update"));
165
+ model.addHook("afterDestroy", createAfterHook("destroy"));
166
+ });
167
+ },
168
+ hasPaperTrail: function hasPaperTrail() {
169
+ return Sequelize !== null;
170
+ },
171
+ defineModels: function defineModels(db) {
172
+ if (!Sequelize) {
173
+ throw new Error("PaperTrail not initialized. Call paperTrail.init() first.");
174
+ }
175
+ const Revision = db.define("Revision", {
176
+ id: {
177
+ type: Sequelize.INTEGER,
178
+ primaryKey: true,
179
+ autoIncrement: true,
180
+ },
181
+ documentId: {
182
+ type: Sequelize.STRING,
183
+ allowNull: false,
184
+ },
185
+ revision: {
186
+ type: Sequelize.INTEGER,
187
+ allowNull: false,
188
+ },
189
+ document: {
190
+ type: Sequelize.TEXT,
191
+ allowNull: false,
192
+ },
193
+ operation: {
194
+ type: Sequelize.STRING,
195
+ allowNull: false,
196
+ },
197
+ changes: {
198
+ type: Sequelize.TEXT,
199
+ allowNull: true,
200
+ },
201
+ userId: {
202
+ type: Sequelize.INTEGER,
203
+ allowNull: true,
204
+ },
205
+ tenantId: {
206
+ type: Sequelize.INTEGER,
207
+ allowNull: true,
208
+ },
209
+ createdAt: {
210
+ type: Sequelize.DATE,
211
+ allowNull: false,
212
+ },
213
+ }, {
214
+ tableName: "revisions",
215
+ timestamps: false,
216
+ });
217
+ // Add associations if user and tenant models exist
218
+ if (db.models.User) {
219
+ Revision.belongsTo(db.models.User, { foreignKey: "userId" });
220
+ }
221
+ if (db.models.Tenant) {
222
+ Revision.belongsTo(db.models.Tenant, { foreignKey: "tenantId" });
223
+ }
224
+ Revision.associate = function associate(models) {
225
+ if (models.User) {
226
+ Revision.belongsTo(models.User, { foreignKey: "userId" });
227
+ }
228
+ if (models.Tenant) {
229
+ Revision.belongsTo(models.Tenant, { foreignKey: "tenantId" });
230
+ }
231
+ };
232
+ },
233
+ };
234
+ export default paperTrail;
235
+ //# 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 { type CLIInitOptions, cliSleep, commonCLIInit, continueCLIPrompt, type PromptOptions, promptCLIAsync, setupCLIParser, waitCLIPrompt, };
@@ -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 { ArgumentParser } from "argparse";
9
+ import prompt from "prompt";
10
+ import { S4Logger } from "../logger/s4-logger.js";
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 { cliSleep, commonCLIInit, continueCLIPrompt, promptCLIAsync, setupCLIParser, waitCLIPrompt, };
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../ts/prompts/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,0EAA0E;AAC1E,kEAAkE;AAClE,qEAAqE;AACrE,sEAAsE;AACtE,qEAAqE;AACrE,eAAe;AAEf,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;AAiB9B,2FAA2F;AAC3F,MAAM,cAAc,GAAG,CAAC,WAAmB,EAAkB,EAAE;IAC7D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,IAAI,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,4EAA4E;AAC5E,8EAA8E;AAC9E,MAAM,aAAa,GAAG,KAAK,EAAE,UAA0B,EAAE,EAAiB,EAAE;IAC1E,4EAA4E;IAC5E,MAAM,cAAc,GAA6B;QAC/C,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,IAAI;QACf,GAAG,OAAO;KACX,CAAC;IAEF,yDAAyD;IACzD,+BAA+B;IAC/B,MAAM,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAEzC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACvC,GAAG,EAAE,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,OAAsB,EAAgC,EAAE;IACpF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE;YACzC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,qEAAqE;AACrE,4DAA4D;AAC5D,MAAM,aAAa,GAAkB;IACnC,wBAAwB,EAAE;QACxB,IAAI,EAAE,SAAS;KAChB;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAkB;IACvC,0BAA0B,EAAE;QAC1B,IAAI,EAAE,SAAS;KAChB;CACF,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,EAAU,EAAiB,EAAE;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAEL,QAAQ,EACR,aAAa,EACb,iBAAiB,EAEjB,cAAc,EACd,cAAc,EACd,aAAa,GACd,CAAC"}