x-fidelity 3.13.0 → 3.13.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 (41) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/core/configManager.test.js +2 -1
  3. package/dist/core/engine/engineRunner.test.js +1 -0
  4. package/dist/core/pluginRegistry.test.js +1 -0
  5. package/dist/demoConfig/node-fullstack-exemptions/project1-node-fullstack-exemptions.json +2 -2
  6. package/dist/facts/globalFileAnalysisFacts.test.js +1 -0
  7. package/dist/facts/index.test.js +3 -1
  8. package/dist/facts/openaiAnalysisFacts.test.js +1 -0
  9. package/dist/operators/fileContains.test.js +4 -1
  10. package/dist/operators/globalPatternCount.test.js +2 -0
  11. package/dist/operators/globalPatternRatio.test.js +2 -0
  12. package/dist/operators/openaiAnalysisHighSeverity.test.js +2 -0
  13. package/dist/operators/regexMatch.test.js +4 -1
  14. package/dist/plugins/xfiPluginRemoteStringValidator/facts/remoteSubstringValidation.test.js +2 -0
  15. package/dist/plugins/xfiPluginRemoteStringValidator/operators/invalidRemoteValidation.test.js +2 -0
  16. package/dist/plugins/xfiPluginRequiredFiles/operators/missingRequiredFiles.test.js +4 -1
  17. package/dist/server/cacheManager.test.js +2 -1
  18. package/dist/utils/exemptionUtils.js +15 -4
  19. package/dist/utils/exemptionUtils.test.js +1 -0
  20. package/dist/utils/ruleUtils.test.js +1 -0
  21. package/package.json +1 -1
  22. package/src/core/configManager.test.ts +2 -1
  23. package/src/core/engine/engineRunner.test.ts +1 -0
  24. package/src/core/pluginRegistry.test.ts +1 -0
  25. package/src/demoConfig/node-fullstack-exemptions/project1-node-fullstack-exemptions.json +2 -2
  26. package/src/exampleTriggerFiles/mixedUIComponents.tsx +9 -9
  27. package/src/facts/globalFileAnalysisFacts.test.ts +1 -0
  28. package/src/facts/index.test.ts +3 -1
  29. package/src/facts/openaiAnalysisFacts.test.ts +1 -0
  30. package/src/operators/fileContains.test.ts +4 -1
  31. package/src/operators/globalPatternCount.test.ts +2 -0
  32. package/src/operators/globalPatternRatio.test.ts +2 -0
  33. package/src/operators/openaiAnalysisHighSeverity.test.ts +2 -0
  34. package/src/operators/regexMatch.test.ts +4 -1
  35. package/src/plugins/xfiPluginRemoteStringValidator/facts/remoteSubstringValidation.test.ts +2 -0
  36. package/src/plugins/xfiPluginRemoteStringValidator/operators/invalidRemoteValidation.test.ts +2 -0
  37. package/src/plugins/xfiPluginRequiredFiles/operators/missingRequiredFiles.test.ts +4 -1
  38. package/src/server/cacheManager.test.ts +2 -1
  39. package/src/utils/exemptionUtils.test.ts +1 -0
  40. package/src/utils/exemptionUtils.ts +23 -5
  41. package/src/utils/ruleUtils.test.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [3.13.1](https://github.com/zotoio/x-fidelity/compare/v3.13.0...v3.13.1) (2025-03-11)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **exemptions:** trace logging ([343744c](https://github.com/zotoio/x-fidelity/commit/343744c161d2756d9fa5e419426d0b4f1a37d1d4))
7
+
1
8
  # [3.13.0](https://github.com/zotoio/x-fidelity/compare/v3.12.1...v3.13.0) (2025-03-10)
2
9
 
3
10
 
@@ -118,7 +118,8 @@ jest.mock('../utils/logger', () => ({
118
118
  debug: jest.fn(),
119
119
  error: jest.fn(),
120
120
  info: jest.fn(),
121
- warn: jest.fn()
121
+ warn: jest.fn(),
122
+ trace: jest.fn()
122
123
  },
123
124
  setLogPrefix: jest.fn()
124
125
  }));
@@ -19,6 +19,7 @@ jest.mock('../../utils/logger', () => ({
19
19
  debug: jest.fn(),
20
20
  error: jest.fn(),
21
21
  warn: jest.fn(),
22
+ trace: jest.fn()
22
23
  },
23
24
  }));
24
25
  describe('runEngineOnFiles', () => {
@@ -8,6 +8,7 @@ jest.mock('../utils/logger', () => ({
8
8
  warn: jest.fn(),
9
9
  error: jest.fn(),
10
10
  debug: jest.fn(),
11
+ trace: jest.fn()
11
12
  },
12
13
  }));
13
14
  describe('XFiPluginRegistry', () => {
@@ -1,8 +1,8 @@
1
1
  [
2
2
  {
3
3
  "repoUrl": "git@github.com:zotoio/x-fidelity.git",
4
- "rule": "outdatedFramework-global",
5
- "expirationDate": "2023-12-31",
4
+ "rule": "noDatabases-iterative",
5
+ "expirationDate": "2026-01-04",
6
6
  "reason": "Upgrading dependencies is scheduled for Q4 2024"
7
7
  },
8
8
  {
@@ -17,6 +17,7 @@ jest.mock('../utils/logger', () => ({
17
17
  error: jest.fn(),
18
18
  info: jest.fn(),
19
19
  warn: jest.fn(),
20
+ trace: jest.fn()
20
21
  },
21
22
  }));
22
23
  describe('globalFileAnalysis', () => {
@@ -27,7 +27,9 @@ jest.mock('../utils/logger', () => ({
27
27
  logger: {
28
28
  info: jest.fn(),
29
29
  debug: jest.fn(),
30
- warn: jest.fn()
30
+ warn: jest.fn(),
31
+ trace: jest.fn(),
32
+ error: jest.fn()
31
33
  }
32
34
  }));
33
35
  describe('loadFacts', () => {
@@ -22,6 +22,7 @@ jest.mock('../utils/logger', () => ({
22
22
  error: jest.fn(),
23
23
  info: jest.fn(),
24
24
  warn: jest.fn(),
25
+ trace: jest.fn()
25
26
  },
26
27
  }));
27
28
  jest.mock('openai', () => {
@@ -5,7 +5,10 @@ const fileContains_1 = require("./fileContains");
5
5
  jest.mock('../utils/logger', () => ({
6
6
  logger: {
7
7
  debug: jest.fn(),
8
- error: jest.fn()
8
+ error: jest.fn(),
9
+ trace: jest.fn(),
10
+ info: jest.fn(),
11
+ warn: jest.fn()
9
12
  },
10
13
  }));
11
14
  describe('fileContains', () => {
@@ -6,6 +6,8 @@ jest.mock('../utils/logger', () => ({
6
6
  debug: jest.fn(),
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
  describe('globalPatternCount', () => {
@@ -6,6 +6,8 @@ jest.mock('../utils/logger', () => ({
6
6
  debug: jest.fn(),
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
  describe('globalPatternRatio', () => {
@@ -7,6 +7,8 @@ jest.mock('../utils/logger', () => ({
7
7
  error: jest.fn(),
8
8
  debug: jest.fn(),
9
9
  info: jest.fn(),
10
+ trace: jest.fn(),
11
+ warn: jest.fn()
10
12
  },
11
13
  }));
12
14
  describe('openaiAnalysisHighSeverity', () => {
@@ -5,7 +5,10 @@ const logger_1 = require("../utils/logger");
5
5
  jest.mock('../utils/logger', () => ({
6
6
  logger: {
7
7
  debug: jest.fn(),
8
- error: jest.fn()
8
+ error: jest.fn(),
9
+ trace: jest.fn(),
10
+ info: jest.fn(),
11
+ warn: jest.fn()
9
12
  },
10
13
  }));
11
14
  describe('regexMatch', () => {
@@ -16,6 +16,8 @@ jest.mock('../../../utils/logger', () => ({
16
16
  debug: jest.fn(),
17
17
  error: jest.fn(),
18
18
  info: jest.fn(),
19
+ trace: jest.fn(),
20
+ warn: jest.fn()
19
21
  },
20
22
  }));
21
23
  describe('remoteSubstringValidation', () => {
@@ -6,6 +6,8 @@ jest.mock('../../../utils/logger', () => ({
6
6
  debug: jest.fn(),
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
  describe('invalidRemoteValidation', () => {
@@ -5,7 +5,10 @@ const logger_1 = require("../../../utils/logger");
5
5
  jest.mock('../../../utils/logger', () => ({
6
6
  logger: {
7
7
  debug: jest.fn(),
8
- error: jest.fn()
8
+ error: jest.fn(),
9
+ trace: jest.fn(),
10
+ info: jest.fn(),
11
+ warn: jest.fn()
9
12
  },
10
13
  }));
11
14
  describe('missingRequiredFiles', () => {
@@ -9,7 +9,8 @@ jest.mock('../utils/logger', () => ({
9
9
  debug: jest.fn(),
10
10
  info: jest.fn(),
11
11
  error: jest.fn(),
12
- warn: jest.fn()
12
+ warn: jest.fn(),
13
+ trace: jest.fn()
13
14
  }
14
15
  }));
15
16
  describe('Cache Manager', () => {
@@ -166,11 +166,22 @@ function isExempt(params) {
166
166
  }
167
167
  const now = new Date();
168
168
  const normalizedRepoUrl = normalizeGitHubUrl(repoUrl);
169
- const exemption = exemptions.find(exemption => normalizeGitHubUrl(exemption.repoUrl) === normalizedRepoUrl &&
170
- exemption.rule === ruleName &&
171
- new Date(exemption.expirationDate) > now);
169
+ logger_1.logger.trace(`Checking exemption for rule ${ruleName} in repo ${repoUrl}`);
170
+ const exemption = exemptions.find(exemption => {
171
+ logger_1.logger.trace(JSON.stringify(exemption));
172
+ logger_1.logger.trace(`repoUrl: ${repoUrl}`);
173
+ logger_1.logger.trace(`ruleName: ${ruleName}`);
174
+ logger_1.logger.trace(`normalizedRepoUrl: ${normalizedRepoUrl}`);
175
+ logger_1.logger.trace(`now: ${now}`);
176
+ const result = normalizeGitHubUrl(exemption.repoUrl) === normalizedRepoUrl &&
177
+ exemption.rule === ruleName &&
178
+ new Date(exemption.expirationDate) > now;
179
+ logger_1.logger.trace(`Exemption check result: ${result}`);
180
+ return result;
181
+ });
182
+ logger_1.logger.trace(`Exemption: ${exemption}`);
172
183
  if (exemption) {
173
- logger_1.logger.error(`Exempting rule ${ruleName} for repo ${repoUrl} until ${exemption.expirationDate}`);
184
+ logger_1.logger.error(`Exempting rule ${ruleName} for repo ${normalizedRepoUrl}: ${exemption.expirationDate}`);
174
185
  // Send telemetry event for the allowed exemption
175
186
  (0, telemetry_1.sendTelemetry)({
176
187
  eventType: 'exemptionAllowed',
@@ -29,6 +29,7 @@ jest.mock('./logger', () => ({
29
29
  warn: jest.fn(),
30
30
  error: jest.fn(),
31
31
  debug: jest.fn(),
32
+ trace: jest.fn(),
32
33
  },
33
34
  }));
34
35
  describe('normalizeGitHubUrl', () => {
@@ -39,6 +39,7 @@ jest.mock('./logger', () => ({
39
39
  error: jest.fn(),
40
40
  info: jest.fn(),
41
41
  warn: jest.fn(),
42
+ trace: jest.fn(),
42
43
  },
43
44
  }));
44
45
  describe('loadRules', () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "x-fidelity",
3
- "version": "3.13.0",
3
+ "version": "3.13.1",
4
4
  "description": "cli for opinionated framework adherence checks",
5
5
  "main": "dist/index",
6
6
  "types": "dist/index.d.ts",
@@ -81,7 +81,8 @@ jest.mock('../utils/logger', () => ({
81
81
  debug: jest.fn(),
82
82
  error: jest.fn(),
83
83
  info: jest.fn(),
84
- warn: jest.fn()
84
+ warn: jest.fn(),
85
+ trace: jest.fn()
85
86
  },
86
87
  setLogPrefix: jest.fn()
87
88
  }));
@@ -10,6 +10,7 @@ jest.mock('../../utils/logger', () => ({
10
10
  debug: jest.fn(),
11
11
  error: jest.fn(),
12
12
  warn: jest.fn(),
13
+ trace: jest.fn()
13
14
  },
14
15
  }));
15
16
 
@@ -8,6 +8,7 @@ jest.mock('../utils/logger', () => ({
8
8
  warn: jest.fn(),
9
9
  error: jest.fn(),
10
10
  debug: jest.fn(),
11
+ trace: jest.fn()
11
12
  },
12
13
  }));
13
14
 
@@ -1,8 +1,8 @@
1
1
  [
2
2
  {
3
3
  "repoUrl": "git@github.com:zotoio/x-fidelity.git",
4
- "rule": "outdatedFramework-global",
5
- "expirationDate": "2023-12-31",
4
+ "rule": "noDatabases-iterative",
5
+ "expirationDate": "2026-01-04",
6
6
  "reason": "Upgrading dependencies is scheduled for Q4 2024"
7
7
  },
8
8
  {
@@ -1,11 +1,11 @@
1
- import { Button } from 'antd';
2
- import * as React from 'react';
3
- import Checkbox from '@mui/material/Checkbox';
1
+ // import { Button } from 'antd';
2
+ // import * as React from 'react';
3
+ // import Checkbox from '@mui/material/Checkbox';
4
4
 
5
- export default function ButtonUsage() {
6
- return <Button variant="contained">Hello world</Button>;
7
- }
5
+ // export default function ButtonUsage() {
6
+ // return <Button variant="contained">Hello world</Button>;
7
+ // }
8
8
 
9
- export default function CheckboxUsage() {
10
- return <Checkbox type="primary">Click Me</Checkbox>;
11
- }
9
+ // export default function CheckboxUsage() {
10
+ // return <Checkbox type="primary">Click Me</Checkbox>;
11
+ // }
@@ -7,6 +7,7 @@ jest.mock('../utils/logger', () => ({
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
9
  warn: jest.fn(),
10
+ trace: jest.fn()
10
11
  },
11
12
  }));
12
13
 
@@ -21,7 +21,9 @@ jest.mock('../utils/logger', () => ({
21
21
  logger: {
22
22
  info: jest.fn(),
23
23
  debug: jest.fn(),
24
- warn: jest.fn()
24
+ warn: jest.fn(),
25
+ trace: jest.fn(),
26
+ error: jest.fn()
25
27
  }
26
28
  }));
27
29
 
@@ -14,6 +14,7 @@ jest.mock('../utils/logger', () => ({
14
14
  error: jest.fn(),
15
15
  info: jest.fn(),
16
16
  warn: jest.fn(),
17
+ trace: jest.fn()
17
18
  },
18
19
  }));
19
20
 
@@ -4,7 +4,10 @@ import { fileContains } from './fileContains';
4
4
  jest.mock('../utils/logger', () => ({
5
5
  logger: {
6
6
  debug: jest.fn(),
7
- error: jest.fn()
7
+ error: jest.fn(),
8
+ trace: jest.fn(),
9
+ info: jest.fn(),
10
+ warn: jest.fn()
8
11
  },
9
12
  }));
10
13
 
@@ -6,6 +6,8 @@ jest.mock('../utils/logger', () => ({
6
6
  debug: jest.fn(),
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
 
@@ -6,6 +6,8 @@ jest.mock('../utils/logger', () => ({
6
6
  debug: jest.fn(),
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
 
@@ -6,6 +6,8 @@ jest.mock('../utils/logger', () => ({
6
6
  error: jest.fn(),
7
7
  debug: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
 
@@ -4,7 +4,10 @@ import { logger } from '../utils/logger';
4
4
  jest.mock('../utils/logger', () => ({
5
5
  logger: {
6
6
  debug: jest.fn(),
7
- error: jest.fn()
7
+ error: jest.fn(),
8
+ trace: jest.fn(),
9
+ info: jest.fn(),
10
+ warn: jest.fn()
8
11
  },
9
12
  }));
10
13
 
@@ -6,6 +6,8 @@ jest.mock('../../../utils/logger', () => ({
6
6
  debug: jest.fn(),
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
 
@@ -6,6 +6,8 @@ jest.mock('../../../utils/logger', () => ({
6
6
  debug: jest.fn(),
7
7
  error: jest.fn(),
8
8
  info: jest.fn(),
9
+ trace: jest.fn(),
10
+ warn: jest.fn()
9
11
  },
10
12
  }));
11
13
 
@@ -4,7 +4,10 @@ import { logger } from '../../../utils/logger';
4
4
  jest.mock('../../../utils/logger', () => ({
5
5
  logger: {
6
6
  debug: jest.fn(),
7
- error: jest.fn()
7
+ error: jest.fn(),
8
+ trace: jest.fn(),
9
+ info: jest.fn(),
10
+ warn: jest.fn()
8
11
  },
9
12
  }));
10
13
 
@@ -8,7 +8,8 @@ jest.mock('../utils/logger', () => ({
8
8
  debug: jest.fn(),
9
9
  info: jest.fn(),
10
10
  error: jest.fn(),
11
- warn: jest.fn()
11
+ warn: jest.fn(),
12
+ trace: jest.fn()
12
13
  }
13
14
  }));
14
15
 
@@ -18,6 +18,7 @@ jest.mock('./logger', () => ({
18
18
  warn: jest.fn(),
19
19
  error: jest.fn(),
20
20
  debug: jest.fn(),
21
+ trace: jest.fn(),
21
22
  },
22
23
  }));
23
24
 
@@ -155,13 +155,31 @@ export function isExempt(params: IsExemptParams): boolean {
155
155
  }
156
156
  const now = new Date();
157
157
  const normalizedRepoUrl = normalizeGitHubUrl(repoUrl);
158
- const exemption = exemptions.find(exemption =>
159
- normalizeGitHubUrl(exemption.repoUrl) === normalizedRepoUrl &&
158
+
159
+ logger.trace(`Checking exemption for rule ${ruleName} in repo ${repoUrl}`);
160
+
161
+ const exemption = exemptions.find(exemption => {
162
+
163
+ logger.trace(JSON.stringify(exemption));
164
+ logger.trace(`repoUrl: ${repoUrl}`);
165
+ logger.trace(`ruleName: ${ruleName}`);
166
+ logger.trace(`normalizedRepoUrl: ${normalizedRepoUrl}`);
167
+ logger.trace(`now: ${now}`);
168
+
169
+ const result = normalizeGitHubUrl(exemption.repoUrl) === normalizedRepoUrl &&
160
170
  exemption.rule === ruleName &&
161
- new Date(exemption.expirationDate) > now
162
- );
171
+ new Date(exemption.expirationDate) > now;
172
+
173
+ logger.trace(`Exemption check result: ${result}`);
174
+
175
+ return result;
176
+
177
+ });
178
+
179
+ logger.trace(`Exemption: ${exemption}`);
180
+
163
181
  if (exemption) {
164
- logger.error(`Exempting rule ${ruleName} for repo ${repoUrl} until ${exemption.expirationDate}`);
182
+ logger.error(`Exempting rule ${ruleName} for repo ${normalizedRepoUrl}: ${exemption.expirationDate}`);
165
183
 
166
184
  // Send telemetry event for the allowed exemption
167
185
  sendTelemetry({
@@ -27,6 +27,7 @@ jest.mock('./logger', () => ({
27
27
  error: jest.fn(),
28
28
  info: jest.fn(),
29
29
  warn: jest.fn(),
30
+ trace: jest.fn(),
30
31
  },
31
32
  }));
32
33