@trentapps/manager-protocol 1.1.3 → 1.2.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.
- package/README.md +28 -0
- package/dist/analyzers/CSSAnalyzer.d.ts +180 -8
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/CSSAnalyzer.js +561 -105
- package/dist/analyzers/CSSAnalyzer.js.map +1 -1
- package/dist/config/dashboard.d.ts +55 -0
- package/dist/config/dashboard.d.ts.map +1 -0
- package/dist/config/dashboard.js +103 -0
- package/dist/config/dashboard.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/dashboard/httpDashboard.d.ts +100 -0
- package/dist/dashboard/httpDashboard.d.ts.map +1 -0
- package/dist/dashboard/httpDashboard.js +1276 -0
- package/dist/dashboard/httpDashboard.js.map +1 -0
- package/dist/dashboard/index.d.ts +6 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +7 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/engine/AuditLogger.d.ts +370 -2
- package/dist/engine/AuditLogger.d.ts.map +1 -1
- package/dist/engine/AuditLogger.js +1064 -24
- package/dist/engine/AuditLogger.js.map +1 -1
- package/dist/engine/GitHubClient.d.ts +183 -0
- package/dist/engine/GitHubClient.d.ts.map +1 -0
- package/dist/engine/GitHubClient.js +411 -0
- package/dist/engine/GitHubClient.js.map +1 -0
- package/dist/engine/RateLimiter.d.ts +5 -3
- package/dist/engine/RateLimiter.d.ts.map +1 -1
- package/dist/engine/RateLimiter.js +49 -72
- package/dist/engine/RateLimiter.js.map +1 -1
- package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
- package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
- package/dist/engine/RuleDependencyAnalyzer.js +475 -0
- package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
- package/dist/engine/RulesEngine.d.ts +102 -3
- package/dist/engine/RulesEngine.d.ts.map +1 -1
- package/dist/engine/RulesEngine.js +326 -21
- package/dist/engine/RulesEngine.js.map +1 -1
- package/dist/engine/TaskManager.d.ts +10 -14
- package/dist/engine/TaskManager.d.ts.map +1 -1
- package/dist/engine/TaskManager.js +169 -197
- package/dist/engine/TaskManager.js.map +1 -1
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +5 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/rules/azure.d.ts.map +1 -1
- package/dist/rules/azure.js +12 -14
- package/dist/rules/azure.js.map +1 -1
- package/dist/rules/compliance.d.ts.map +1 -1
- package/dist/rules/compliance.js +23 -41
- package/dist/rules/compliance.js.map +1 -1
- package/dist/rules/condition-optimizer.d.ts +151 -0
- package/dist/rules/condition-optimizer.d.ts.map +1 -0
- package/dist/rules/condition-optimizer.js +479 -0
- package/dist/rules/condition-optimizer.js.map +1 -0
- package/dist/rules/css.d.ts.map +1 -1
- package/dist/rules/css.js +538 -0
- package/dist/rules/css.js.map +1 -1
- package/dist/rules/field-standards.d.ts +1172 -0
- package/dist/rules/field-standards.d.ts.map +1 -0
- package/dist/rules/field-standards.js +908 -0
- package/dist/rules/field-standards.js.map +1 -0
- package/dist/rules/flask.d.ts.map +1 -1
- package/dist/rules/flask.js +18 -31
- package/dist/rules/flask.js.map +1 -1
- package/dist/rules/index.d.ts +220 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +155 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/ml-ai.d.ts.map +1 -1
- package/dist/rules/ml-ai.js +11 -13
- package/dist/rules/ml-ai.js.map +1 -1
- package/dist/rules/patterns.d.ts +568 -0
- package/dist/rules/patterns.d.ts.map +1 -0
- package/dist/rules/patterns.js +1359 -0
- package/dist/rules/patterns.js.map +1 -0
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +580 -19
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/shared-patterns.d.ts +268 -0
- package/dist/rules/shared-patterns.d.ts.map +1 -0
- package/dist/rules/shared-patterns.js +556 -0
- package/dist/rules/shared-patterns.js.map +1 -0
- package/dist/rules/storage.d.ts +8 -2
- package/dist/rules/storage.d.ts.map +1 -1
- package/dist/rules/storage.js +541 -3
- package/dist/rules/storage.js.map +1 -1
- package/dist/rules/stripe.d.ts.map +1 -1
- package/dist/rules/stripe.js +19 -26
- package/dist/rules/stripe.js.map +1 -1
- package/dist/rules/websocket.d.ts.map +1 -1
- package/dist/rules/websocket.js +32 -40
- package/dist/rules/websocket.js.map +1 -1
- package/dist/supervisor/AgentSupervisor.d.ts +52 -0
- package/dist/supervisor/AgentSupervisor.d.ts.map +1 -1
- package/dist/supervisor/AgentSupervisor.js +120 -1
- package/dist/supervisor/AgentSupervisor.js.map +1 -1
- package/dist/supervisor/ManagedServerRegistry.d.ts +139 -2
- package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -1
- package/dist/supervisor/ManagedServerRegistry.js +590 -6
- package/dist/supervisor/ManagedServerRegistry.js.map +1 -1
- package/dist/supervisor/ProjectTracker.d.ts +2 -1
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -1
- package/dist/supervisor/ProjectTracker.js +5 -9
- package/dist/supervisor/ProjectTracker.js.map +1 -1
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/rule-tester.d.ts +217 -0
- package/dist/testing/rule-tester.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.d.ts +57 -0
- package/dist/testing/rule-tester.examples.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.js +375 -0
- package/dist/testing/rule-tester.examples.js.map +1 -0
- package/dist/testing/rule-tester.js +381 -0
- package/dist/testing/rule-tester.js.map +1 -0
- package/dist/testing/rule-validator.d.ts +141 -0
- package/dist/testing/rule-validator.d.ts.map +1 -0
- package/dist/testing/rule-validator.js +640 -0
- package/dist/testing/rule-validator.js.map +1 -0
- package/dist/types/index.d.ts +265 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +57 -2
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/rate-limiting.d.ts +268 -0
- package/dist/utils/rate-limiting.d.ts.map +1 -0
- package/dist/utils/rate-limiting.js +403 -0
- package/dist/utils/rate-limiting.js.map +1 -0
- package/dist/utils/shared.d.ts +306 -0
- package/dist/utils/shared.d.ts.map +1 -0
- package/dist/utils/shared.js +464 -0
- package/dist/utils/shared.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rule Testing Framework Examples
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to use the RuleTester class to test business rules.
|
|
5
|
+
* These examples can be run with vitest or used as reference for writing your own tests.
|
|
6
|
+
*/
|
|
7
|
+
import { RuleTester, testRule, createTestCase, expectApproval, expectWarn, expectNoMatch, assertions } from './rule-tester.js';
|
|
8
|
+
import { validateRule, checkForConflicts, lintRules } from './rule-validator.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// EXAMPLE RULE DEFINITIONS
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Example security rule that blocks PII access without authorization
|
|
14
|
+
*/
|
|
15
|
+
export const examplePiiAccessRule = {
|
|
16
|
+
id: 'example-pii-access',
|
|
17
|
+
name: 'Block PII Access Without Authorization',
|
|
18
|
+
description: 'Prevents unauthorized access to personally identifiable information',
|
|
19
|
+
type: 'security',
|
|
20
|
+
enabled: true,
|
|
21
|
+
priority: 950,
|
|
22
|
+
conditions: [
|
|
23
|
+
{ field: 'actionCategory', operator: 'equals', value: 'pii_access' },
|
|
24
|
+
{ field: 'userRole', operator: 'not_in', value: ['admin', 'data_officer', 'compliance'] }
|
|
25
|
+
],
|
|
26
|
+
conditionLogic: 'all',
|
|
27
|
+
actions: [
|
|
28
|
+
{ type: 'deny', message: 'PII access requires authorized role' }
|
|
29
|
+
],
|
|
30
|
+
riskWeight: 45,
|
|
31
|
+
tags: ['pii', 'gdpr', 'privacy']
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Example rule that requires approval for production deployments
|
|
35
|
+
*/
|
|
36
|
+
export const exampleProductionDeployRule = {
|
|
37
|
+
id: 'example-prod-deploy',
|
|
38
|
+
name: 'Require Approval for Production Deployment',
|
|
39
|
+
description: 'Requires human approval for deploying to production',
|
|
40
|
+
type: 'operational',
|
|
41
|
+
enabled: true,
|
|
42
|
+
priority: 900,
|
|
43
|
+
conditions: [
|
|
44
|
+
{ field: 'actionName', operator: 'contains', value: 'deploy' },
|
|
45
|
+
{ field: 'environment', operator: 'equals', value: 'production' }
|
|
46
|
+
],
|
|
47
|
+
conditionLogic: 'all',
|
|
48
|
+
actions: [
|
|
49
|
+
{ type: 'require_approval', message: 'Production deployments require approval' }
|
|
50
|
+
],
|
|
51
|
+
riskWeight: 35,
|
|
52
|
+
tags: ['deployment', 'production']
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Example rule that warns about large data operations
|
|
56
|
+
*/
|
|
57
|
+
export const exampleLargeDataWarningRule = {
|
|
58
|
+
id: 'example-large-data-warning',
|
|
59
|
+
name: 'Warn on Large Data Operations',
|
|
60
|
+
description: 'Warns when operating on more than 10,000 records',
|
|
61
|
+
type: 'data_governance',
|
|
62
|
+
enabled: true,
|
|
63
|
+
priority: 700,
|
|
64
|
+
conditions: [
|
|
65
|
+
{ field: 'recordCount', operator: 'greater_than', value: 10000 }
|
|
66
|
+
],
|
|
67
|
+
conditionLogic: 'all',
|
|
68
|
+
actions: [
|
|
69
|
+
{ type: 'warn', message: 'Large data operation detected (>10,000 records)' }
|
|
70
|
+
],
|
|
71
|
+
riskWeight: 15,
|
|
72
|
+
tags: ['data', 'performance']
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Example rule with dependencies
|
|
76
|
+
*/
|
|
77
|
+
export const exampleAuthCheckRule = {
|
|
78
|
+
id: 'example-auth-check',
|
|
79
|
+
name: 'Check Authentication First',
|
|
80
|
+
description: 'Base authentication check that other rules depend on',
|
|
81
|
+
type: 'security',
|
|
82
|
+
enabled: true,
|
|
83
|
+
priority: 1000,
|
|
84
|
+
conditions: [
|
|
85
|
+
{ field: 'authToken', operator: 'not_exists', value: null }
|
|
86
|
+
],
|
|
87
|
+
conditionLogic: 'all',
|
|
88
|
+
actions: [
|
|
89
|
+
{ type: 'deny', message: 'Authentication required' }
|
|
90
|
+
],
|
|
91
|
+
riskWeight: 50,
|
|
92
|
+
tags: ['authentication']
|
|
93
|
+
};
|
|
94
|
+
export const exampleApiCallRule = {
|
|
95
|
+
id: 'example-api-call',
|
|
96
|
+
name: 'API Call Logging',
|
|
97
|
+
description: 'Logs all external API calls',
|
|
98
|
+
type: 'operational',
|
|
99
|
+
enabled: true,
|
|
100
|
+
priority: 800,
|
|
101
|
+
conditions: [
|
|
102
|
+
{ field: 'actionCategory', operator: 'equals', value: 'external_api' }
|
|
103
|
+
],
|
|
104
|
+
conditionLogic: 'all',
|
|
105
|
+
actions: [
|
|
106
|
+
{ type: 'log', message: 'External API call detected' },
|
|
107
|
+
{ type: 'allow' }
|
|
108
|
+
],
|
|
109
|
+
riskWeight: 10,
|
|
110
|
+
tags: ['api', 'logging'],
|
|
111
|
+
dependsOn: ['example-auth-check'], // Must check auth first
|
|
112
|
+
relatedRules: ['example-pii-access']
|
|
113
|
+
};
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// EXAMPLE TEST CASES USING RuleTester
|
|
116
|
+
// ============================================================================
|
|
117
|
+
/**
|
|
118
|
+
* Example: Testing PII access rule with RuleTester class
|
|
119
|
+
*/
|
|
120
|
+
export function runPiiAccessRuleTests() {
|
|
121
|
+
const tester = new RuleTester({ verbose: true });
|
|
122
|
+
const result = tester.testRule(examplePiiAccessRule, [
|
|
123
|
+
// Test 1: Should deny unauthorized user accessing PII
|
|
124
|
+
{
|
|
125
|
+
description: 'Should deny regular user accessing PII',
|
|
126
|
+
input: {
|
|
127
|
+
action: {
|
|
128
|
+
name: 'read_customer_data',
|
|
129
|
+
category: 'pii_access'
|
|
130
|
+
},
|
|
131
|
+
context: {
|
|
132
|
+
userRole: 'developer'
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
expectedResult: {
|
|
136
|
+
shouldMatch: true,
|
|
137
|
+
status: 'denied',
|
|
138
|
+
allowed: false,
|
|
139
|
+
violationCount: 1
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
// Test 2: Should allow admin to access PII
|
|
143
|
+
{
|
|
144
|
+
description: 'Should allow admin to access PII',
|
|
145
|
+
input: {
|
|
146
|
+
action: {
|
|
147
|
+
name: 'read_customer_data',
|
|
148
|
+
category: 'pii_access'
|
|
149
|
+
},
|
|
150
|
+
context: {
|
|
151
|
+
userRole: 'admin'
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
expectedResult: {
|
|
155
|
+
shouldMatch: false // Rule should not match for authorized users
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
// Test 3: Should allow data_officer to access PII
|
|
159
|
+
{
|
|
160
|
+
description: 'Should allow data_officer to access PII',
|
|
161
|
+
input: {
|
|
162
|
+
action: {
|
|
163
|
+
name: 'export_user_emails',
|
|
164
|
+
category: 'pii_access'
|
|
165
|
+
},
|
|
166
|
+
context: {
|
|
167
|
+
userRole: 'data_officer'
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
expectedResult: {
|
|
171
|
+
shouldMatch: false
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
// Test 4: Should not match non-PII access
|
|
175
|
+
{
|
|
176
|
+
description: 'Should not match non-PII data access',
|
|
177
|
+
input: {
|
|
178
|
+
action: {
|
|
179
|
+
name: 'read_public_stats',
|
|
180
|
+
category: 'data_access'
|
|
181
|
+
},
|
|
182
|
+
context: {
|
|
183
|
+
userRole: 'developer'
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
expectedResult: {
|
|
187
|
+
shouldMatch: false
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
]);
|
|
191
|
+
console.log('\nPII Access Rule Test Results:');
|
|
192
|
+
console.log(` Total: ${result.totalTests}`);
|
|
193
|
+
console.log(` Passed: ${result.passedTests}`);
|
|
194
|
+
console.log(` Failed: ${result.failedTests}`);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Example: Using convenience functions for test cases
|
|
198
|
+
*/
|
|
199
|
+
export function runProductionDeployTests() {
|
|
200
|
+
const result = testRule(exampleProductionDeployRule, [
|
|
201
|
+
// Using expectApproval helper
|
|
202
|
+
expectApproval('Should require approval for production deployment', {
|
|
203
|
+
name: 'deploy_service',
|
|
204
|
+
category: 'code_execution'
|
|
205
|
+
}, { context: { environment: 'production' } }),
|
|
206
|
+
// Using expectNoMatch helper
|
|
207
|
+
expectNoMatch('Should not require approval for staging deployment', {
|
|
208
|
+
name: 'deploy_service',
|
|
209
|
+
category: 'code_execution'
|
|
210
|
+
}, { environment: 'staging' }),
|
|
211
|
+
// Using createTestCase for custom expectations
|
|
212
|
+
createTestCase('Should require approval only when deploying to production', {
|
|
213
|
+
name: 'deploy_application',
|
|
214
|
+
category: 'code_execution'
|
|
215
|
+
}, {
|
|
216
|
+
shouldMatch: true,
|
|
217
|
+
status: 'pending_approval',
|
|
218
|
+
requiresHumanApproval: true
|
|
219
|
+
}, { environment: 'production' })
|
|
220
|
+
]);
|
|
221
|
+
console.log('\nProduction Deploy Rule Test Results:');
|
|
222
|
+
console.log(` Total: ${result.totalTests}`);
|
|
223
|
+
console.log(` Passed: ${result.passedTests}`);
|
|
224
|
+
console.log(` Failed: ${result.failedTests}`);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Example: Testing warning rules
|
|
228
|
+
*/
|
|
229
|
+
export function runLargeDataWarningTests() {
|
|
230
|
+
const result = testRule(exampleLargeDataWarningRule, [
|
|
231
|
+
// Using expectWarn helper
|
|
232
|
+
expectWarn('Should warn for large data operations', {
|
|
233
|
+
name: 'bulk_update',
|
|
234
|
+
category: 'data_modification',
|
|
235
|
+
parameters: { recordCount: 50000 }
|
|
236
|
+
}),
|
|
237
|
+
// Should not warn for small operations
|
|
238
|
+
expectNoMatch('Should not warn for small data operations', {
|
|
239
|
+
name: 'update_record',
|
|
240
|
+
category: 'data_modification',
|
|
241
|
+
parameters: { recordCount: 100 }
|
|
242
|
+
})
|
|
243
|
+
]);
|
|
244
|
+
console.log('\nLarge Data Warning Rule Test Results:');
|
|
245
|
+
console.log(` Total: ${result.totalTests}`);
|
|
246
|
+
console.log(` Passed: ${result.passedTests}`);
|
|
247
|
+
console.log(` Failed: ${result.failedTests}`);
|
|
248
|
+
}
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// EXAMPLE: USING ASSERTION HELPERS
|
|
251
|
+
// ============================================================================
|
|
252
|
+
/**
|
|
253
|
+
* Example: Using assertion helpers for vitest/jest integration
|
|
254
|
+
*/
|
|
255
|
+
export function demonstrateAssertions() {
|
|
256
|
+
const action = {
|
|
257
|
+
name: 'read_customer_data',
|
|
258
|
+
category: 'pii_access'
|
|
259
|
+
};
|
|
260
|
+
const unauthorizedContext = { userRole: 'developer' };
|
|
261
|
+
const authorizedContext = { userRole: 'admin' };
|
|
262
|
+
// Using assertion helpers
|
|
263
|
+
const matchesUnauthorized = assertions.ruleMatches(examplePiiAccessRule, action, unauthorizedContext);
|
|
264
|
+
console.log(`Rule matches unauthorized access: ${matchesUnauthorized}`); // true
|
|
265
|
+
const matchesAuthorized = assertions.ruleMatches(examplePiiAccessRule, action, authorizedContext);
|
|
266
|
+
console.log(`Rule matches authorized access: ${matchesAuthorized}`); // false
|
|
267
|
+
const deniesUnauthorized = assertions.ruleDenies(examplePiiAccessRule, action, unauthorizedContext);
|
|
268
|
+
console.log(`Rule denies unauthorized access: ${deniesUnauthorized}`); // true
|
|
269
|
+
}
|
|
270
|
+
// ============================================================================
|
|
271
|
+
// EXAMPLE: RULE VALIDATION
|
|
272
|
+
// ============================================================================
|
|
273
|
+
/**
|
|
274
|
+
* Example: Validating rule structure
|
|
275
|
+
*/
|
|
276
|
+
export function demonstrateValidation() {
|
|
277
|
+
// Valid rule
|
|
278
|
+
const validResult = validateRule(examplePiiAccessRule);
|
|
279
|
+
console.log('\nValid rule validation:');
|
|
280
|
+
console.log(` Is valid: ${validResult.isValid}`);
|
|
281
|
+
console.log(` Errors: ${validResult.errors.length}`);
|
|
282
|
+
console.log(` Warnings: ${validResult.warnings.length}`);
|
|
283
|
+
// Invalid rule (missing required fields)
|
|
284
|
+
const invalidRule = {
|
|
285
|
+
id: 'invalid-rule',
|
|
286
|
+
// Missing name, type, conditions, actions
|
|
287
|
+
};
|
|
288
|
+
const invalidResult = validateRule(invalidRule);
|
|
289
|
+
console.log('\nInvalid rule validation:');
|
|
290
|
+
console.log(` Is valid: ${invalidResult.isValid}`);
|
|
291
|
+
console.log(` Errors: ${invalidResult.errors.map(e => e.message).join(', ')}`);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Example: Checking for rule conflicts
|
|
295
|
+
*/
|
|
296
|
+
export function demonstrateConflictDetection() {
|
|
297
|
+
// Create two rules with conflicting actions
|
|
298
|
+
const rule1 = {
|
|
299
|
+
id: 'conflict-allow',
|
|
300
|
+
name: 'Allow API Calls',
|
|
301
|
+
type: 'operational',
|
|
302
|
+
enabled: true,
|
|
303
|
+
priority: 500,
|
|
304
|
+
conditions: [
|
|
305
|
+
{ field: 'actionCategory', operator: 'equals', value: 'external_api' }
|
|
306
|
+
],
|
|
307
|
+
conditionLogic: 'all',
|
|
308
|
+
actions: [{ type: 'allow' }],
|
|
309
|
+
riskWeight: 0
|
|
310
|
+
};
|
|
311
|
+
const rule2 = {
|
|
312
|
+
id: 'conflict-deny',
|
|
313
|
+
name: 'Deny API Calls',
|
|
314
|
+
type: 'security',
|
|
315
|
+
enabled: true,
|
|
316
|
+
priority: 500,
|
|
317
|
+
conditions: [
|
|
318
|
+
{ field: 'actionCategory', operator: 'equals', value: 'external_api' }
|
|
319
|
+
],
|
|
320
|
+
conditionLogic: 'all',
|
|
321
|
+
actions: [{ type: 'deny' }],
|
|
322
|
+
riskWeight: 50
|
|
323
|
+
};
|
|
324
|
+
const conflictResult = checkForConflicts([rule1, rule2]);
|
|
325
|
+
console.log('\nConflict detection:');
|
|
326
|
+
console.log(` Has conflicts: ${conflictResult.hasConflicts}`);
|
|
327
|
+
for (const conflict of conflictResult.conflicts) {
|
|
328
|
+
console.log(` - ${conflict.conflictType}: ${conflict.description}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Example: Linting rules for best practices
|
|
333
|
+
*/
|
|
334
|
+
export function demonstrateLinting() {
|
|
335
|
+
const rules = [
|
|
336
|
+
examplePiiAccessRule,
|
|
337
|
+
exampleProductionDeployRule,
|
|
338
|
+
exampleLargeDataWarningRule,
|
|
339
|
+
exampleAuthCheckRule,
|
|
340
|
+
exampleApiCallRule
|
|
341
|
+
];
|
|
342
|
+
const lintResult = lintRules(rules);
|
|
343
|
+
console.log('\nLint results:');
|
|
344
|
+
console.log(` Total issues: ${lintResult.totalIssues}`);
|
|
345
|
+
console.log(` Errors: ${lintResult.errors.length}`);
|
|
346
|
+
console.log(` Warnings: ${lintResult.warnings.length}`);
|
|
347
|
+
console.log(` Suggestions: ${lintResult.suggestions.length}`);
|
|
348
|
+
for (const error of lintResult.errors) {
|
|
349
|
+
console.log(` [ERROR] ${error.ruleId}: ${error.message}`);
|
|
350
|
+
}
|
|
351
|
+
for (const warning of lintResult.warnings) {
|
|
352
|
+
console.log(` [WARN] ${warning.ruleId}: ${warning.message}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// ============================================================================
|
|
356
|
+
// RUN ALL EXAMPLES
|
|
357
|
+
// ============================================================================
|
|
358
|
+
/**
|
|
359
|
+
* Run all examples to demonstrate the testing framework
|
|
360
|
+
*/
|
|
361
|
+
export function runAllExamples() {
|
|
362
|
+
console.log('=== Rule Testing Framework Examples ===\n');
|
|
363
|
+
console.log('--- Test Case Examples ---');
|
|
364
|
+
runPiiAccessRuleTests();
|
|
365
|
+
runProductionDeployTests();
|
|
366
|
+
runLargeDataWarningTests();
|
|
367
|
+
console.log('\n--- Assertion Helpers ---');
|
|
368
|
+
demonstrateAssertions();
|
|
369
|
+
console.log('\n--- Validation Examples ---');
|
|
370
|
+
demonstrateValidation();
|
|
371
|
+
demonstrateConflictDetection();
|
|
372
|
+
demonstrateLinting();
|
|
373
|
+
console.log('\n=== Examples Complete ===');
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=rule-tester.examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-tester.examples.js","sourceRoot":"","sources":["../../src/testing/rule-tester.examples.ts"],"names":[],"mappings":"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"}
|