echo-audit-log 1.0.0

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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +568 -0
  3. package/dist/adapters/base-adapter.d.ts +13 -0
  4. package/dist/adapters/base-adapter.d.ts.map +1 -0
  5. package/dist/adapters/base-adapter.js +17 -0
  6. package/dist/adapters/base-adapter.js.map +1 -0
  7. package/dist/adapters/sequelize-adapter.d.ts +22 -0
  8. package/dist/adapters/sequelize-adapter.d.ts.map +1 -0
  9. package/dist/adapters/sequelize-adapter.js +181 -0
  10. package/dist/adapters/sequelize-adapter.js.map +1 -0
  11. package/dist/core/audit-logger.d.ts +15 -0
  12. package/dist/core/audit-logger.d.ts.map +1 -0
  13. package/dist/core/audit-logger.js +36 -0
  14. package/dist/core/audit-logger.js.map +1 -0
  15. package/dist/index.d.ts +12 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/middleware/express-middleware.d.ts +10 -0
  20. package/dist/middleware/express-middleware.d.ts.map +1 -0
  21. package/dist/middleware/express-middleware.js +37 -0
  22. package/dist/middleware/express-middleware.js.map +1 -0
  23. package/dist/migrations/create-audit-logs-table.d.ts +4 -0
  24. package/dist/migrations/create-audit-logs-table.d.ts.map +1 -0
  25. package/dist/migrations/create-audit-logs-table.js +75 -0
  26. package/dist/migrations/create-audit-logs-table.js.map +1 -0
  27. package/dist/models/audit-log.model.d.ts +29 -0
  28. package/dist/models/audit-log.model.d.ts.map +1 -0
  29. package/dist/models/audit-log.model.js +80 -0
  30. package/dist/models/audit-log.model.js.map +1 -0
  31. package/dist/types/index.d.ts +72 -0
  32. package/dist/types/index.d.ts.map +1 -0
  33. package/dist/types/index.js +2 -0
  34. package/dist/types/index.js.map +1 -0
  35. package/dist/utils/config-resolver.d.ts +12 -0
  36. package/dist/utils/config-resolver.d.ts.map +1 -0
  37. package/dist/utils/config-resolver.js +90 -0
  38. package/dist/utils/config-resolver.js.map +1 -0
  39. package/dist/utils/field-filter.d.ts +10 -0
  40. package/dist/utils/field-filter.d.ts.map +1 -0
  41. package/dist/utils/field-filter.js +43 -0
  42. package/dist/utils/field-filter.js.map +1 -0
  43. package/dist/utils/validation.d.ts +8 -0
  44. package/dist/utils/validation.d.ts.map +1 -0
  45. package/dist/utils/validation.js +31 -0
  46. package/dist/utils/validation.js.map +1 -0
  47. package/package.json +54 -0
@@ -0,0 +1,12 @@
1
+ import { AuditLogConfig, ResolvedModelConfig } from '../types/index.js';
2
+ export declare class ConfigResolver {
3
+ private config;
4
+ constructor(config: AuditLogConfig);
5
+ resolveModelConfig(modelName: string): ResolvedModelConfig;
6
+ private resolveEnabled;
7
+ private resolveIncludeColumns;
8
+ private resolveExcludeColumns;
9
+ private resolveOperations;
10
+ private resolveValueStorageMode;
11
+ }
12
+ //# sourceMappingURL=config-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/config-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAU1F,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB;IAkD1D,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,uBAAuB;CAYhC"}
@@ -0,0 +1,90 @@
1
+ const DEFAULT_OPERATIONS = {
2
+ insert: true,
3
+ update: true,
4
+ delete: true,
5
+ };
6
+ const DEFAULT_VALUE_STORAGE_MODE = 'all';
7
+ export class ConfigResolver {
8
+ config;
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ resolveModelConfig(modelName) {
13
+ // Always disable auditing for AuditLog model to prevent infinite loops
14
+ if (modelName === 'AuditLog') {
15
+ return {
16
+ enabled: false,
17
+ columns: {
18
+ include: null,
19
+ exclude: [],
20
+ },
21
+ operations: DEFAULT_OPERATIONS,
22
+ valueStorageMode: DEFAULT_VALUE_STORAGE_MODE,
23
+ };
24
+ }
25
+ const globalConfig = this.config.global || {};
26
+ const modelConfig = this.config.models?.[modelName] || {};
27
+ const enabled = this.resolveEnabled(globalConfig.enabled, modelConfig.enabled);
28
+ const includeColumns = this.resolveIncludeColumns(globalConfig.columns?.include, modelConfig.columns?.include);
29
+ const excludeColumns = this.resolveExcludeColumns(globalConfig.columns?.exclude, modelConfig.columns?.exclude);
30
+ const operations = this.resolveOperations(globalConfig.operations, modelConfig.operations);
31
+ const valueStorageMode = this.resolveValueStorageMode(globalConfig.valueStorageMode, modelConfig.valueStorageMode);
32
+ return {
33
+ enabled,
34
+ columns: {
35
+ include: includeColumns,
36
+ exclude: excludeColumns,
37
+ },
38
+ operations,
39
+ valueStorageMode,
40
+ };
41
+ }
42
+ resolveEnabled(globalEnabled, modelEnabled) {
43
+ if (modelEnabled !== undefined) {
44
+ return modelEnabled;
45
+ }
46
+ if (globalEnabled !== undefined) {
47
+ return globalEnabled;
48
+ }
49
+ return true;
50
+ }
51
+ resolveIncludeColumns(globalInclude, modelInclude) {
52
+ if (modelInclude !== undefined) {
53
+ return modelInclude;
54
+ }
55
+ if (globalInclude !== undefined) {
56
+ return globalInclude;
57
+ }
58
+ return null;
59
+ }
60
+ resolveExcludeColumns(globalExclude, modelExclude) {
61
+ const merged = new Set();
62
+ if (globalExclude) {
63
+ globalExclude.forEach((col) => merged.add(col));
64
+ }
65
+ if (modelExclude) {
66
+ modelExclude.forEach((col) => merged.add(col));
67
+ }
68
+ return Array.from(merged);
69
+ }
70
+ resolveOperations(globalOps, modelOps) {
71
+ const resolved = { ...DEFAULT_OPERATIONS };
72
+ if (globalOps) {
73
+ Object.assign(resolved, globalOps);
74
+ }
75
+ if (modelOps) {
76
+ Object.assign(resolved, modelOps);
77
+ }
78
+ return resolved;
79
+ }
80
+ resolveValueStorageMode(globalMode, modelMode) {
81
+ if (modelMode !== undefined) {
82
+ return modelMode;
83
+ }
84
+ if (globalMode !== undefined) {
85
+ return globalMode;
86
+ }
87
+ return DEFAULT_VALUE_STORAGE_MODE;
88
+ }
89
+ }
90
+ //# sourceMappingURL=config-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-resolver.js","sourceRoot":"","sources":["../../src/utils/config-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ResolvedModelConfig, ValueStorageMode } from '../types/index.js';
2
+ export declare class FieldFilter {
3
+ static filterFields(data: Record<string, any>, config: ResolvedModelConfig): Record<string, any>;
4
+ static getChangedFields(oldValues: Record<string, any>, newValues: Record<string, any>): Record<string, any>;
5
+ static prepareValuesForStorage(oldValues: Record<string, any> | null, newValues: Record<string, any> | null, valueStorageMode: ValueStorageMode): {
6
+ oldValues: Record<string, any> | null;
7
+ newValues: Record<string, any> | null;
8
+ };
9
+ }
10
+ //# sourceMappingURL=field-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-filter.d.ts","sourceRoot":"","sources":["../../src/utils/field-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,qBAAa,WAAW;IACtB,MAAM,CAAC,YAAY,CACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAmBtB,MAAM,CAAC,gBAAgB,CACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAYtB,MAAM,CAAC,uBAAuB,CAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EACrC,gBAAgB,EAAE,gBAAgB,GACjC;QAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;KAAE;CAqBpF"}
@@ -0,0 +1,43 @@
1
+ export class FieldFilter {
2
+ static filterFields(data, config) {
3
+ const { include, exclude } = config.columns;
4
+ const filtered = {};
5
+ const keys = Object.keys(data);
6
+ for (const key of keys) {
7
+ if (exclude.includes(key)) {
8
+ continue;
9
+ }
10
+ if (include === null || include.includes(key)) {
11
+ filtered[key] = data[key];
12
+ }
13
+ }
14
+ return filtered;
15
+ }
16
+ static getChangedFields(oldValues, newValues) {
17
+ const changed = {};
18
+ for (const key in newValues) {
19
+ if (oldValues[key] !== newValues[key]) {
20
+ changed[key] = newValues[key];
21
+ }
22
+ }
23
+ return changed;
24
+ }
25
+ static prepareValuesForStorage(oldValues, newValues, valueStorageMode) {
26
+ if (valueStorageMode === 'all') {
27
+ return { oldValues, newValues };
28
+ }
29
+ if (valueStorageMode === 'changed' && oldValues && newValues) {
30
+ const changedFields = FieldFilter.getChangedFields(oldValues, newValues);
31
+ const changedOldValues = {};
32
+ for (const key in changedFields) {
33
+ changedOldValues[key] = oldValues[key];
34
+ }
35
+ return {
36
+ oldValues: changedOldValues,
37
+ newValues: changedFields,
38
+ };
39
+ }
40
+ return { oldValues, newValues };
41
+ }
42
+ }
43
+ //# sourceMappingURL=field-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-filter.js","sourceRoot":"","sources":["../../src/utils/field-filter.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACtB,MAAM,CAAC,YAAY,CACjB,IAAyB,EACzB,MAA2B;QAE3B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAC5C,MAAM,QAAQ,GAAwB,EAAE,CAAC;QAEzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,gBAAgB,CACrB,SAA8B,EAC9B,SAA8B;QAE9B,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,uBAAuB,CAC5B,SAAqC,EACrC,SAAqC,EACrC,gBAAkC;QAElC,IAAI,gBAAgB,KAAK,KAAK,EAAE,CAAC;YAC/B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,gBAAgB,KAAK,SAAS,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC7D,MAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACzE,MAAM,gBAAgB,GAAwB,EAAE,CAAC;YAEjD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;gBAChC,gBAAgB,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,gBAAgB;gBAC3B,SAAS,EAAE,aAAa;aACzB,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { AuditLogConfig } from '../types/index.js';
2
+ export declare class ConfigValidator {
3
+ static validate(config: AuditLogConfig): {
4
+ valid: boolean;
5
+ errors: string[];
6
+ };
7
+ }
8
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,qBAAa,eAAe;IAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CAqC9E"}
@@ -0,0 +1,31 @@
1
+ export class ConfigValidator {
2
+ static validate(config) {
3
+ const errors = [];
4
+ if (config.global?.columns?.include && config.global?.columns?.exclude) {
5
+ if (config.global.columns.include.length > 0 && config.global.columns.exclude.length > 0) {
6
+ errors.push('Global config cannot have both include and exclude columns specified');
7
+ }
8
+ }
9
+ if (config.models) {
10
+ for (const [modelName, modelConfig] of Object.entries(config.models)) {
11
+ // Prevent enabling AuditLog model auditing
12
+ if (modelName === 'AuditLog' && modelConfig.enabled === true) {
13
+ errors.push('AuditLog model cannot be audited. Auditing is always disabled for AuditLog to prevent infinite loops.');
14
+ }
15
+ if (modelConfig.columns?.include && modelConfig.columns?.exclude) {
16
+ if (modelConfig.columns.include.length > 0 && modelConfig.columns.exclude.length > 0) {
17
+ errors.push(`Model "${modelName}" cannot have both include and exclude columns specified`);
18
+ }
19
+ }
20
+ }
21
+ }
22
+ if (config.auditTableName && !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(config.auditTableName)) {
23
+ errors.push('Invalid audit table name. Must be a valid SQL identifier');
24
+ }
25
+ return {
26
+ valid: errors.length === 0,
27
+ errors,
28
+ };
29
+ }
30
+ }
31
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IAC1B,MAAM,CAAC,QAAQ,CAAC,MAAsB;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YACvE,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzF,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrE,2CAA2C;gBAC3C,IAAI,SAAS,KAAK,UAAU,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC7D,MAAM,CAAC,IAAI,CACT,uGAAuG,CACxG,CAAC;gBACJ,CAAC;gBAED,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;oBACjE,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrF,MAAM,CAAC,IAAI,CACT,UAAU,SAAS,0DAA0D,CAC9E,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACrF,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "echo-audit-log",
3
+ "version": "1.0.0",
4
+ "description": "Production-grade, schema-driven audit logging utility for Node.js backend applications with ORM adapter support",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "engines": {
9
+ "node": ">=22.0.0"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "watch": "tsc --watch",
14
+ "prepublishOnly": "npm run build",
15
+ "test": "echo \"Tests not yet implemented\" && exit 0"
16
+ },
17
+ "keywords": [
18
+ "audit",
19
+ "logging",
20
+ "audit-log",
21
+ "sequelize",
22
+ "orm",
23
+ "typescript",
24
+ "database",
25
+ "tracking",
26
+ "history",
27
+ "changelog"
28
+ ],
29
+ "author": "",
30
+ "license": "MIT",
31
+ "peerDependencies": {
32
+ "sequelize": "^6.0.0"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "sequelize": {
36
+ "optional": true
37
+ }
38
+ },
39
+ "devDependencies": {
40
+ "@types/express": "^5.0.6",
41
+ "@types/node": "^22.0.0",
42
+ "sequelize": "^6.37.7",
43
+ "typescript": "^5.3.0"
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "README.md",
48
+ "LICENSE"
49
+ ],
50
+ "repository": {
51
+ "type": "git",
52
+ "url": ""
53
+ }
54
+ }