const test = require('node:test'); const assert = require('node:assert/strict'); const { readdirSync, readFileSync } = require('node:fs'); const { join } = require('node:path'); test('download and offline icons never use emoji or text glyphs', () => { // Arrow keys are prose, not action icons. Exact lines prevent new exceptions. const allow = new Map([ ['index.html', new Set(['
↑↓Volume up / down
'])], ['admin.html', new Set(['Shortcuts: Space stamp (Tap-sync) · S stamp selected · K play · ↑↓ select · ⌘/Ctrl S save'])], ]); const failures=[]; for (const file of readdirSync(__dirname).filter(f=>/\.(js|html|css)$/.test(f) && !f.endsWith('.test.js'))) { readFileSync(join(__dirname,file),'utf8').split('\n').forEach((line,i)=>{ if (/[⬇⤓⇩💾📥↓]/u.test(line) && !allow.get(file)?.has(line.trim())) failures.push(`${file}:${i+1}`); }); } assert.deepEqual(failures,[]); });