Lines 6-46javascript
6import { isRetiredHeading, readRetiredLessons, retireLesson, writeRetiredLessons, } from './retired-lessons.js';
7// ─── Helpers ────────────────────────────────────────────
10 tmpDir = path.join(os.tmpdir(), `totem-retired-${crypto.randomUUID()}`);
11 fs.mkdirSync(tmpDir, { recursive: true });
14 fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
16function makeLedgerFile(entries) {
17 fs.writeFileSync(path.join(tmpDir, 'retired-lessons.json'), JSON.stringify(entries, null, 2), 'utf-8');
19// ─── readRetiredLessons ─────────────────────────────────
20describe('readRetiredLessons', () => {
21 it('returns empty array when file does not exist', () => {
22 const result = readRetiredLessons(tmpDir);
23 expect(result).toEqual([]);
25 it('parses valid JSON correctly', () => {
27 { heading: 'Avoid eval()', reason: 'Too broad', retiredAt: '2026-04-01T00:00:00.000Z' },
28 {
LowEval
Package source references a known benign dynamic code generation pattern.
dist/retired-lessons.test.jsView on unpkg · L26 29 heading: 'Use strict mode',
30 reason: 'Duplicates compiler flag',
31 retiredAt: '2026-04-02T00:00:00.000Z',
34 makeLedgerFile(entries);
35 const result = readRetiredLessons(tmpDir);
36 expect(result).toHaveLength(2);
37 expect(result[0].heading).toBe('Avoid eval()');
38 expect(result[1].reason).toBe('Duplicates compiler flag');
40 it('returns empty array on malformed JSON', () => {
41 fs.writeFileSync(path.join(tmpDir, 'retired-lessons.json'), '{{{not json', 'utf-8');
42 const result = readRetiredLessons(tmpDir);
43 expect(result).toEqual([]);
46// ─── retireLesson ───────────────────────────────────────