@mmnto/totem 1.14.12 → 1.14.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/adversarial.test.js +20 -15
- package/dist/adversarial.test.js.map +1 -1
- package/dist/compiler.d.ts +1 -1
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +1 -1
- package/dist/compiler.js.map +1 -1
- package/dist/compiler.test.js +32 -28
- package/dist/compiler.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/rule-engine.d.ts +56 -13
- package/dist/rule-engine.d.ts.map +1 -1
- package/dist/rule-engine.js +62 -40
- package/dist/rule-engine.js.map +1 -1
- package/dist/rule-engine.test.js +87 -56
- package/dist/rule-engine.test.js.map +1 -1
- package/dist/rule-tester.d.ts.map +1 -1
- package/dist/rule-tester.js +9 -3
- package/dist/rule-tester.js.map +1 -1
- package/dist/test-utils.d.ts +9 -0
- package/dist/test-utils.d.ts.map +1 -1
- package/dist/test-utils.js +13 -0
- package/dist/test-utils.js.map +1 -1
- package/package.json +1 -1
package/dist/adversarial.test.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
1
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
2
|
import { applyRules, applyRulesToAdditions, } from './compiler.js';
|
|
3
|
+
import { makeRuleEngineCtx } from './test-utils.js';
|
|
4
|
+
let ctx;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
ctx = makeRuleEngineCtx();
|
|
7
|
+
});
|
|
3
8
|
// ─── Adversarial Evaluation Harness ─────────────────
|
|
4
9
|
//
|
|
5
10
|
// Tests that compiled Totem rules catch planted bugs in realistic diffs.
|
|
@@ -37,7 +42,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
37
42
|
+ - run: npm run test
|
|
38
43
|
- run: pnpm build
|
|
39
44
|
`;
|
|
40
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
45
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
41
46
|
expect(violations.length).toBeGreaterThan(0); // totem-ignore
|
|
42
47
|
expect(violations.some((v) => v.rule.lessonHeading === 'Never use npm')).toBe(true);
|
|
43
48
|
});
|
|
@@ -52,7 +57,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
52
57
|
+ console.error(error);
|
|
53
58
|
}
|
|
54
59
|
`;
|
|
55
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
60
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
56
61
|
expect(violations.some((v) => v.rule.lessonHeading === 'Use err not error')).toBe(true);
|
|
57
62
|
});
|
|
58
63
|
it('catches debugger statements left in production code', () => {
|
|
@@ -66,7 +71,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
66
71
|
+ debugger;
|
|
67
72
|
return res.json();
|
|
68
73
|
`;
|
|
69
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
74
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
70
75
|
const debugViolations = violations.filter((v) => v.rule.lessonHeading === 'No debugger in production');
|
|
71
76
|
expect(debugViolations).toHaveLength(2);
|
|
72
77
|
});
|
|
@@ -80,7 +85,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
80
85
|
+ return fetchData().catch(() => {})
|
|
81
86
|
}
|
|
82
87
|
`;
|
|
83
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
88
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
84
89
|
expect(violations.some((v) => v.rule.lessonHeading === 'No empty catch blocks')).toBe(true);
|
|
85
90
|
});
|
|
86
91
|
it('catches TODO comments in new code', () => {
|
|
@@ -93,7 +98,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
93
98
|
+ // FIXME: this is a temporary hack
|
|
94
99
|
return validateToken(token);
|
|
95
100
|
`;
|
|
96
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
101
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
97
102
|
const todoViolations = violations.filter((v) => v.rule.lessonHeading === 'No TODO in production');
|
|
98
103
|
expect(todoViolations).toHaveLength(2);
|
|
99
104
|
});
|
|
@@ -107,7 +112,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
107
112
|
+ password: 'hunter2',
|
|
108
113
|
};
|
|
109
114
|
`;
|
|
110
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
115
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
111
116
|
expect(violations.some((v) => v.rule.lessonHeading === 'No hardcoded secrets')).toBe(true);
|
|
112
117
|
});
|
|
113
118
|
it('catches TypeScript any type', () => {
|
|
@@ -120,7 +125,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
120
125
|
+ metadata: any;
|
|
121
126
|
}
|
|
122
127
|
`;
|
|
123
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
128
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
124
129
|
expect(violations.some((v) => v.rule.lessonHeading === 'No any types')).toBe(true);
|
|
125
130
|
});
|
|
126
131
|
it('passes a clean diff with no violations', () => {
|
|
@@ -133,7 +138,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
133
138
|
+ return \`Hello, \${name}!\`;
|
|
134
139
|
}
|
|
135
140
|
`;
|
|
136
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
141
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
137
142
|
expect(violations).toHaveLength(0);
|
|
138
143
|
});
|
|
139
144
|
it('respects inline suppression (totem-ignore)', () => {
|
|
@@ -145,7 +150,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
145
150
|
+ debugger; // totem-ignore
|
|
146
151
|
run();
|
|
147
152
|
`;
|
|
148
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
153
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
149
154
|
const debugViolations = violations.filter((v) => v.rule.lessonHeading === 'No debugger in production');
|
|
150
155
|
expect(debugViolations).toHaveLength(0);
|
|
151
156
|
});
|
|
@@ -165,7 +170,7 @@ describe('adversarial evaluation harness', () => {
|
|
|
165
170
|
+ const data: any = fetch('/api');
|
|
166
171
|
}
|
|
167
172
|
`;
|
|
168
|
-
const violations = applyRules(ADVERSARIAL_RULES, diff);
|
|
173
|
+
const violations = applyRules(ctx, ADVERSARIAL_RULES, diff);
|
|
169
174
|
// Should catch: debugger, TODO, error (not err), any
|
|
170
175
|
expect(violations.length).toBeGreaterThanOrEqual(4); // totem-ignore
|
|
171
176
|
const headings = new Set(violations.map((v) => v.rule.lessonHeading));
|
|
@@ -204,7 +209,7 @@ describe('AST gating suppresses false positives', () => {
|
|
|
204
209
|
astContext: 'string',
|
|
205
210
|
},
|
|
206
211
|
];
|
|
207
|
-
const violations = applyRulesToAdditions(rules, additions);
|
|
212
|
+
const violations = applyRulesToAdditions(ctx, rules, additions);
|
|
208
213
|
expect(violations).toHaveLength(0);
|
|
209
214
|
});
|
|
210
215
|
it('skips violations in comment-context additions', () => {
|
|
@@ -218,7 +223,7 @@ describe('AST gating suppresses false positives', () => {
|
|
|
218
223
|
astContext: 'comment',
|
|
219
224
|
},
|
|
220
225
|
];
|
|
221
|
-
const violations = applyRulesToAdditions(rules, additions);
|
|
226
|
+
const violations = applyRulesToAdditions(ctx, rules, additions);
|
|
222
227
|
expect(violations).toHaveLength(0);
|
|
223
228
|
});
|
|
224
229
|
it('still catches violations in code-context additions', () => {
|
|
@@ -232,7 +237,7 @@ describe('AST gating suppresses false positives', () => {
|
|
|
232
237
|
astContext: 'code',
|
|
233
238
|
},
|
|
234
239
|
];
|
|
235
|
-
const violations = applyRulesToAdditions(rules, additions);
|
|
240
|
+
const violations = applyRulesToAdditions(ctx, rules, additions);
|
|
236
241
|
expect(violations.length).toBeGreaterThan(0); // totem-ignore
|
|
237
242
|
expect(violations.some((v) => v.rule.lessonHeading === 'No debugger in production')).toBe(true);
|
|
238
243
|
});
|
|
@@ -248,7 +253,7 @@ describe('AST gating suppresses false positives', () => {
|
|
|
248
253
|
// astContext is undefined
|
|
249
254
|
},
|
|
250
255
|
];
|
|
251
|
-
const violations = applyRulesToAdditions(rules, additions);
|
|
256
|
+
const violations = applyRulesToAdditions(ctx, rules, additions);
|
|
252
257
|
expect(violations.length).toBeGreaterThan(0); // totem-ignore
|
|
253
258
|
});
|
|
254
259
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adversarial.test.js","sourceRoot":"","sources":["../src/adversarial.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"adversarial.test.js","sourceRoot":"","sources":["../src/adversarial.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EACL,UAAU,EACV,qBAAqB,GAItB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,IAAI,GAAsB,CAAC;AAC3B,UAAU,CAAC,GAAG,EAAE;IACd,GAAG,GAAG,iBAAiB,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,uDAAuD;AACvD,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,yEAAyE;AACzE,4DAA4D;AAE5D,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,OAAe,EAAgB,EAAE,CAAC,CAAC;IACrF,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,OAAO;IACtB,OAAO;IACP,OAAO;IACP,MAAM,EAAE,OAAO;IACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;CACrC,CAAC,CAAC;AAEH,wDAAwD;AAExD,MAAM,iBAAiB,GAAmB;IACxC,QAAQ,CACN,iCAAiC,EACjC,0DAA0D,EAC1D,mBAAmB,CACpB;IACD,QAAQ,CACN,oCAAoC,EACpC,+CAA+C,EAC/C,eAAe,CAChB;IACD,QAAQ,CACN,gBAAgB,EAChB,0CAA0C,EAC1C,2BAA2B,CAC5B;IACD,QAAQ,CACN,uBAAuB,EACvB,6DAA6D,EAC7D,uBAAuB,CACxB;IACD,QAAQ,CACN,0CAA0C,EAC1C,4CAA4C,EAC5C,uBAAuB,CACxB;IACD,QAAQ,CACN,qBAAqB,EACrB,4CAA4C,EAC5C,uBAAuB,CACxB;IACD,QAAQ,CACN,uCAAuC,EACvC,0DAA0D,EAC1D,sBAAsB,CACvB;IACD,QAAQ,CAAC,WAAW,EAAE,oDAAoD,EAAE,cAAc,CAAC;CAC5F,CAAC;AAEF,wDAAwD;AAExD,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;QAC7D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG;;;;;;;;;CAShB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG;;;;;;;;;CAShB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,2BAA2B,CAC5D,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,uBAAuB,CACxD,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG;;;;;;;;CAQhB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG;;;;;;;CAOhB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,2BAA2B,CAC5D,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;CAchB,CAAC;QACE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC5D,qDAAqD;QACrD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;QAEpE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,uDAAuD;AAEvD,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAEhC,mEAAmE;QACnE,iDAAiD;QACjD,MAAM,SAAS,GAAmB;YAChC;gBACE,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,QAAQ,EAAE,0BAA0B;aACjD;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,wBAAwB;gBAC9B,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,aAAa;gBAC5B,UAAU,EAAE,QAAQ;aACrB;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,wBAAwB;gBAC9B,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,wBAAwB;gBACvC,UAAU,EAAE,QAAQ;aACrB;SACF,CAAC;QAEF,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAEhC,MAAM,SAAS,GAAmB;YAChC;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,sCAAsC;gBAC5C,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,SAAS;aACtB;SACF,CAAC;QAEF,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAEhC,MAAM,SAAS,GAAmB;YAChC;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,MAAM;aACnB;SACF,CAAC;QAEF,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;QAC7D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAEhC,+DAA+D;QAC/D,MAAM,SAAS,GAAmB;YAChC;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,IAAI;gBACnB,0BAA0B;aAC3B;SACF,CAAC;QAEF,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/compiler.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import type { AstGrepYamlRule, CompiledRule, CompiledRulesFile, CompilerOutput,
|
|
|
11
11
|
export type { AstContext, AstGrepYamlRule, CompiledRule, CompiledRulesFile, CompilerOutput, DiffAddition, NapiConfig, NonCompilableEntry, NonCompilableReasonCode, RegexValidation, RuleEventCallback, RuleEventContext, Violation, } from './compiler-schema.js';
|
|
12
12
|
export { AstGrepYamlRuleSchema, CompiledRuleSchema, CompiledRulesFileSchema, CompilerOutputSchema, NapiConfigSchema, NonCompilableEntryReadSchema, NonCompilableEntryWriteSchema, NonCompilableReasonCodeSchema, } from './compiler-schema.js';
|
|
13
13
|
export { extractAddedLines } from './diff-parser.js';
|
|
14
|
-
export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, type CoreLogger, extractJustification, matchesGlob,
|
|
14
|
+
export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, type CoreLogger, extractJustification, matchesGlob, type RuleEngineContext, } from './rule-engine.js';
|
|
15
15
|
/** Hash a lesson's heading + body to detect changes since compilation. */
|
|
16
16
|
export declare function hashLesson(heading: string, body: string): string;
|
|
17
17
|
/**
|
package/dist/compiler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EAEd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAU9B,YAAY,EACV,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,qBAAqB,EACrB,KAAK,UAAU,EACf,oBAAoB,EACpB,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EAEd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAU9B,YAAY,EACV,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,qBAAqB,EACrB,KAAK,UAAU,EACf,oBAAoB,EACpB,WAAW,EACX,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAM1B,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhE;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAY9D;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,YAAY,EAAE,CAmBhB;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,iBAAiB,CAoBnB;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAMhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAuBtF;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAsB5D;AAwBD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,GAAG,KAAK,EACvB,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1C,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC;AAQnF,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,UAAU,EACpC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA2CF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA4B7E"}
|
package/dist/compiler.js
CHANGED
|
@@ -15,7 +15,7 @@ import { CompiledRulesFileSchema, CompilerOutputSchema, NonCompilableEntryWriteS
|
|
|
15
15
|
import { TotemParseError } from './errors.js';
|
|
16
16
|
export { AstGrepYamlRuleSchema, CompiledRuleSchema, CompiledRulesFileSchema, CompilerOutputSchema, NapiConfigSchema, NonCompilableEntryReadSchema, NonCompilableEntryWriteSchema, NonCompilableReasonCodeSchema, } from './compiler-schema.js';
|
|
17
17
|
export { extractAddedLines } from './diff-parser.js';
|
|
18
|
-
export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, extractJustification, matchesGlob,
|
|
18
|
+
export { applyAstRulesToAdditions, applyRules, applyRulesToAdditions, extractJustification, matchesGlob, } from './rule-engine.js';
|
|
19
19
|
// ─── Hashing ────────────────────────────────────────
|
|
20
20
|
const HASH_SLICE_LEN = 16;
|
|
21
21
|
/** Hash a lesson's heading + body to detect changes since compilation. */
|
package/dist/compiler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmB9C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,qBAAqB,EAErB,oBAAoB,EACpB,WAAW,
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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"}
|
package/dist/compiler.test.js
CHANGED
|
@@ -4,7 +4,11 @@ import * as path from 'node:path';
|
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
5
|
import { applyRules, engineFields, extractAddedLines, hashLesson, loadCompiledRules, loadCompiledRulesFile, parseCompilerResponse, sanitizeFileGlobs, saveCompiledRules, saveCompiledRulesFile, validateRegex, } from './compiler.js';
|
|
6
6
|
import { CompiledRuleSchema } from './compiler-schema.js';
|
|
7
|
-
import { cleanTmpDir } from './test-utils.js';
|
|
7
|
+
import { cleanTmpDir, makeRuleEngineCtx } from './test-utils.js';
|
|
8
|
+
let ctx;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
ctx = makeRuleEngineCtx();
|
|
11
|
+
});
|
|
8
12
|
// ─── hashLesson ──────────────────────────────────────
|
|
9
13
|
describe('hashLesson', () => {
|
|
10
14
|
it('returns a 16-char hex string', () => {
|
|
@@ -173,14 +177,14 @@ describe('applyRules', () => {
|
|
|
173
177
|
`;
|
|
174
178
|
it('detects a simple pattern violation', () => {
|
|
175
179
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
|
|
176
|
-
const violations = applyRules(rules, diff);
|
|
180
|
+
const violations = applyRules(ctx, rules, diff);
|
|
177
181
|
expect(violations).toHaveLength(1);
|
|
178
182
|
expect(violations[0].rule.message).toBe('Do not call npm.install directly');
|
|
179
183
|
expect(violations[0].file).toBe('src/app.ts');
|
|
180
184
|
});
|
|
181
185
|
it('returns no violations when patterns do not match', () => {
|
|
182
186
|
const rules = [makeRule('\\byarn\\b', 'Do not use yarn')];
|
|
183
|
-
const violations = applyRules(rules, diff);
|
|
187
|
+
const violations = applyRules(ctx, rules, diff);
|
|
184
188
|
expect(violations).toHaveLength(0);
|
|
185
189
|
});
|
|
186
190
|
it('applies multiple rules', () => {
|
|
@@ -188,28 +192,28 @@ describe('applyRules', () => {
|
|
|
188
192
|
makeRule('\\bnpm\\b', 'Do not use npm'),
|
|
189
193
|
makeRule('\\berror\\b', 'Use err, not error'),
|
|
190
194
|
];
|
|
191
|
-
const violations = applyRules(rules, diff);
|
|
195
|
+
const violations = applyRules(ctx, rules, diff);
|
|
192
196
|
expect(violations).toHaveLength(2);
|
|
193
197
|
});
|
|
194
198
|
it('throws on rules with invalid regex patterns (mmnto/totem#1442 — no silent-compliance footgun)', () => {
|
|
195
199
|
const rules = [makeRule('[invalid', 'Bad pattern')];
|
|
196
|
-
expect(() => applyRules(rules, diff)).toThrow(/invalid regex pattern/);
|
|
200
|
+
expect(() => applyRules(ctx, rules, diff)).toThrow(/invalid regex pattern/);
|
|
197
201
|
});
|
|
198
202
|
it('returns empty for empty diff', () => {
|
|
199
203
|
const rules = [makeRule('anything', 'test')];
|
|
200
|
-
expect(applyRules(rules, '')).toEqual([]);
|
|
204
|
+
expect(applyRules(ctx, rules, '')).toEqual([]);
|
|
201
205
|
});
|
|
202
206
|
it('returns empty for empty rules', () => {
|
|
203
|
-
expect(applyRules([], diff)).toEqual([]);
|
|
207
|
+
expect(applyRules(ctx, [], diff)).toEqual([]);
|
|
204
208
|
});
|
|
205
209
|
it('excludes files listed in excludeFiles', () => {
|
|
206
210
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
|
|
207
|
-
const violations = applyRules(rules, diff, ['src/app.ts']);
|
|
211
|
+
const violations = applyRules(ctx, rules, diff, ['src/app.ts']);
|
|
208
212
|
expect(violations).toHaveLength(0);
|
|
209
213
|
});
|
|
210
214
|
it('still detects violations in non-excluded files', () => {
|
|
211
215
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
|
|
212
|
-
const violations = applyRules(rules, diff, ['other-file.ts']);
|
|
216
|
+
const violations = applyRules(ctx, rules, diff, ['other-file.ts']);
|
|
213
217
|
expect(violations).toHaveLength(1);
|
|
214
218
|
});
|
|
215
219
|
// ─── fileGlobs scoping ─────────────────────────────
|
|
@@ -233,7 +237,7 @@ describe('applyRules', () => {
|
|
|
233
237
|
].join('\n');
|
|
234
238
|
it('applies rule to all files when fileGlobs is absent', () => {
|
|
235
239
|
const rules = [makeRule('\\$\\w+', 'Found a dollar-sign variable')];
|
|
236
|
-
const violations = applyRules(rules, multiFileDiff);
|
|
240
|
+
const violations = applyRules(ctx, rules, multiFileDiff);
|
|
237
241
|
expect(violations).toHaveLength(2); // matches in both .sh and .ts
|
|
238
242
|
});
|
|
239
243
|
it('restricts rule to matching file types via fileGlobs', () => {
|
|
@@ -243,7 +247,7 @@ describe('applyRules', () => {
|
|
|
243
247
|
fileGlobs: ['*.sh', '*.bash'],
|
|
244
248
|
},
|
|
245
249
|
];
|
|
246
|
-
const violations = applyRules(rules, multiFileDiff);
|
|
250
|
+
const violations = applyRules(ctx, rules, multiFileDiff);
|
|
247
251
|
expect(violations).toHaveLength(1);
|
|
248
252
|
expect(violations[0].file).toBe('deploy.sh');
|
|
249
253
|
});
|
|
@@ -254,7 +258,7 @@ describe('applyRules', () => {
|
|
|
254
258
|
fileGlobs: ['*.py'],
|
|
255
259
|
},
|
|
256
260
|
];
|
|
257
|
-
const violations = applyRules(rules, multiFileDiff);
|
|
261
|
+
const violations = applyRules(ctx, rules, multiFileDiff);
|
|
258
262
|
expect(violations).toHaveLength(0);
|
|
259
263
|
});
|
|
260
264
|
it('handles **/*.ext glob pattern', () => {
|
|
@@ -264,7 +268,7 @@ describe('applyRules', () => {
|
|
|
264
268
|
fileGlobs: ['**/*.ts'],
|
|
265
269
|
},
|
|
266
270
|
];
|
|
267
|
-
const violations = applyRules(rules, multiFileDiff);
|
|
271
|
+
const violations = applyRules(ctx, rules, multiFileDiff);
|
|
268
272
|
expect(violations).toHaveLength(1);
|
|
269
273
|
expect(violations[0].file).toBe('src/utils.ts');
|
|
270
274
|
});
|
|
@@ -275,7 +279,7 @@ describe('applyRules', () => {
|
|
|
275
279
|
fileGlobs: [],
|
|
276
280
|
},
|
|
277
281
|
];
|
|
278
|
-
const violations = applyRules(rules, multiFileDiff);
|
|
282
|
+
const violations = applyRules(ctx, rules, multiFileDiff);
|
|
279
283
|
expect(violations).toHaveLength(2);
|
|
280
284
|
});
|
|
281
285
|
it('excludes files matching negated glob patterns', () => {
|
|
@@ -285,7 +289,7 @@ describe('applyRules', () => {
|
|
|
285
289
|
fileGlobs: ['*.sh', '*.ts', '!*.sh'],
|
|
286
290
|
},
|
|
287
291
|
];
|
|
288
|
-
const violations = applyRules(rules, multiFileDiff);
|
|
292
|
+
const violations = applyRules(ctx, rules, multiFileDiff);
|
|
289
293
|
expect(violations).toHaveLength(1);
|
|
290
294
|
expect(violations[0].file).toBe('src/utils.ts');
|
|
291
295
|
});
|
|
@@ -320,7 +324,7 @@ describe('applyRules', () => {
|
|
|
320
324
|
fileGlobs: ['packages/mcp/**/*.ts'],
|
|
321
325
|
},
|
|
322
326
|
];
|
|
323
|
-
const violations = applyRules(rules, monorepoMultiFileDiff);
|
|
327
|
+
const violations = applyRules(ctx, rules, monorepoMultiFileDiff);
|
|
324
328
|
expect(violations).toHaveLength(2); // server.ts + tools.test.ts
|
|
325
329
|
expect(violations.every((v) => v.file.startsWith('packages/mcp/'))).toBe(true);
|
|
326
330
|
});
|
|
@@ -331,7 +335,7 @@ describe('applyRules', () => {
|
|
|
331
335
|
fileGlobs: ['packages/mcp/**/*.ts', '!**/*.test.ts'],
|
|
332
336
|
},
|
|
333
337
|
];
|
|
334
|
-
const violations = applyRules(rules, monorepoMultiFileDiff);
|
|
338
|
+
const violations = applyRules(ctx, rules, monorepoMultiFileDiff);
|
|
335
339
|
expect(violations).toHaveLength(1);
|
|
336
340
|
expect(violations[0].file).toBe('packages/mcp/src/server.ts');
|
|
337
341
|
});
|
|
@@ -342,7 +346,7 @@ describe('applyRules', () => {
|
|
|
342
346
|
fileGlobs: ['packages/cli/**/*.ts'],
|
|
343
347
|
},
|
|
344
348
|
];
|
|
345
|
-
const violations = applyRules(rules, monorepoMultiFileDiff);
|
|
349
|
+
const violations = applyRules(ctx, rules, monorepoMultiFileDiff);
|
|
346
350
|
expect(violations).toHaveLength(0);
|
|
347
351
|
});
|
|
348
352
|
// ─── Inline suppression (totem-ignore) ─────────────
|
|
@@ -357,7 +361,7 @@ describe('applyRules', () => {
|
|
|
357
361
|
' export default x;',
|
|
358
362
|
].join('\n');
|
|
359
363
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
|
|
360
|
-
const violations = applyRules(rules, suppressedDiff);
|
|
364
|
+
const violations = applyRules(ctx, rules, suppressedDiff);
|
|
361
365
|
expect(violations).toHaveLength(0);
|
|
362
366
|
});
|
|
363
367
|
it('suppresses next-line violation with totem-ignore-next-line (both added)', () => {
|
|
@@ -372,7 +376,7 @@ describe('applyRules', () => {
|
|
|
372
376
|
' export default x;',
|
|
373
377
|
].join('\n');
|
|
374
378
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
|
|
375
|
-
const violations = applyRules(rules, suppressedDiff);
|
|
379
|
+
const violations = applyRules(ctx, rules, suppressedDiff);
|
|
376
380
|
expect(violations).toHaveLength(0);
|
|
377
381
|
});
|
|
378
382
|
it('suppresses next-line violation when directive is a context line', () => {
|
|
@@ -389,7 +393,7 @@ describe('applyRules', () => {
|
|
|
389
393
|
' export default x;',
|
|
390
394
|
].join('\n');
|
|
391
395
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
|
|
392
|
-
const violations = applyRules(rules, suppressedDiff);
|
|
396
|
+
const violations = applyRules(ctx, rules, suppressedDiff);
|
|
393
397
|
expect(violations).toHaveLength(0);
|
|
394
398
|
});
|
|
395
399
|
it('does not suppress when there is no directive', () => {
|
|
@@ -403,7 +407,7 @@ describe('applyRules', () => {
|
|
|
403
407
|
' export default x;',
|
|
404
408
|
].join('\n');
|
|
405
409
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install directly')];
|
|
406
|
-
const violations = applyRules(rules, plainDiff);
|
|
410
|
+
const violations = applyRules(ctx, rules, plainDiff);
|
|
407
411
|
expect(violations).toHaveLength(1);
|
|
408
412
|
});
|
|
409
413
|
it('supports hash-style comment suppression', () => {
|
|
@@ -418,7 +422,7 @@ describe('applyRules', () => {
|
|
|
418
422
|
' exit 0',
|
|
419
423
|
].join('\n');
|
|
420
424
|
const rules = [makeRule('\\$[A-Z_]+', 'Quote shell variables')];
|
|
421
|
-
const violations = applyRules(rules, suppressedDiff);
|
|
425
|
+
const violations = applyRules(ctx, rules, suppressedDiff);
|
|
422
426
|
expect(violations).toHaveLength(0);
|
|
423
427
|
});
|
|
424
428
|
it('supports HTML comment suppression', () => {
|
|
@@ -432,7 +436,7 @@ describe('applyRules', () => {
|
|
|
432
436
|
' More text',
|
|
433
437
|
].join('\n');
|
|
434
438
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install')];
|
|
435
|
-
const violations = applyRules(rules, suppressedDiff);
|
|
439
|
+
const violations = applyRules(ctx, rules, suppressedDiff);
|
|
436
440
|
expect(violations).toHaveLength(0);
|
|
437
441
|
});
|
|
438
442
|
it('suppresses all rule violations on a single ignored line', () => {
|
|
@@ -449,7 +453,7 @@ describe('applyRules', () => {
|
|
|
449
453
|
makeRule('\\bnpm\\.install\\b', 'Do not call npm.install'),
|
|
450
454
|
makeRule('\\berror\\b', 'Use err, not error'),
|
|
451
455
|
];
|
|
452
|
-
const violations = applyRules(rules, suppressedDiff);
|
|
456
|
+
const violations = applyRules(ctx, rules, suppressedDiff);
|
|
453
457
|
expect(violations).toHaveLength(0);
|
|
454
458
|
});
|
|
455
459
|
it('handles suppression at first line of hunk (no preceding line)', () => {
|
|
@@ -463,7 +467,7 @@ describe('applyRules', () => {
|
|
|
463
467
|
' export default x;',
|
|
464
468
|
].join('\n');
|
|
465
469
|
const rules = [makeRule('\\bnpm\\.install\\b', 'Do not call npm.install')];
|
|
466
|
-
const violations = applyRules(rules, suppressedDiff);
|
|
470
|
+
const violations = applyRules(ctx, rules, suppressedDiff);
|
|
467
471
|
expect(violations).toHaveLength(0);
|
|
468
472
|
});
|
|
469
473
|
it('excludes test files with negated glob while matching source files', () => {
|
|
@@ -489,7 +493,7 @@ describe('applyRules', () => {
|
|
|
489
493
|
fileGlobs: ['*.ts', '!*.test.ts', '!*.spec.ts'],
|
|
490
494
|
},
|
|
491
495
|
];
|
|
492
|
-
const violations = applyRules(rules, testFileDiff);
|
|
496
|
+
const violations = applyRules(ctx, rules, testFileDiff);
|
|
493
497
|
expect(violations).toHaveLength(1);
|
|
494
498
|
expect(violations[0].file).toBe('src/utils.ts');
|
|
495
499
|
});
|
|
@@ -647,7 +651,7 @@ describe('compiled rules file I/O', () => {
|
|
|
647
651
|
'+const first = "the active rule must fire here";',
|
|
648
652
|
'+const second = "the archived rule must not fire here";',
|
|
649
653
|
].join('\n');
|
|
650
|
-
const violations = applyRules(rules, diff);
|
|
654
|
+
const violations = applyRules(ctx, rules, diff);
|
|
651
655
|
expect(violations).toHaveLength(1);
|
|
652
656
|
expect(violations[0].rule.lessonHash).toBe(activeRule.lessonHash);
|
|
653
657
|
expect(violations.some((v) => v.rule.lessonHash === archivedRule.lessonHash)).toBe(false);
|