Gå til innholdet

no-emoji-in-output

Forby emoji-tegn i CLI-utdata.

Emoji vises inkonsekvent på tvers av terminaler, bryter justering i monospace-utdata, og skaper problemer med skjermlesere og CI-loggparsere. Denne regelen bruker Unicode-område-regex for å oppdage emoji-tegn og en sekundær sjekk for å sikre at de forekommer inne i streng-literaler (ikke kommentarer eller variabelnavn).

Regelen sjekker også for rå ANSI-escape-koder, og håndhever bruk av styleText() fra node:util for terminalformatering.

src/commands/check.ts
console.log("✅ All checks passed!");
console.log("❌ Validation failed");
console.log("\x1b[32mSuccess\x1b[0m"); // raw ANSI
src/commands/check.ts
import { styleText } from "node:util";
console.log("All checks passed");
console.log("Validation failed");
console.log(styleText("green", "Success"));
/// <reference path="../rules.d.ts" />
const EMOJI_PATTERN =
/[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F900}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/u;
const EMOJI_IN_STRING =
/["'`].*[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F900}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}].*["'`]/u;
export default {
rules: {
"no-emoji-in-output": {
description: "CLI output must not contain emoji characters",
async check(ctx) {
const files = ctx.scopedFiles.filter(
(f) => !f.includes("tests/") && !f.includes(".archgate/")
);
const matches = await Promise.all(
files.map((file) => ctx.grep(file, EMOJI_PATTERN))
);
for (const fileMatches of matches) {
for (const m of fileMatches) {
if (EMOJI_IN_STRING.test(m.content)) {
ctx.report.violation({
message: "Do not use emoji in CLI output strings",
file: m.file,
line: m.line,
fix: "Remove emoji from output strings",
});
}
}
}
},
},
"use-style-text": {
description: "Use styleText from node:util instead of raw ANSI codes",
async check(ctx) {
const files = ctx.scopedFiles.filter(
(f) => !f.includes("tests/") && !f.includes(".archgate/")
);
const matches = await Promise.all(
files.map((file) => ctx.grep(file, /\\u001b\[|\\x1b\[|\\033\[/))
);
for (const fileMatches of matches) {
for (const m of fileMatches) {
ctx.report.violation({
message:
"Use styleText() from node:util instead of raw ANSI escape codes",
file: m.file,
line: m.line,
fix: "Import { styleText } from 'node:util' and use styleText(style, text)",
});
}
}
},
},
},
} satisfies RuleSet;

I CLI-verktøy der konsistent utdata på tvers av terminaler er viktig, eller når tilgjengelighet har prioritet.

I webapplikasjoner eller verktøy der emoji er en del av det forventede brukergrensesnittet, eller når utdataene alltid konsumeres av mennesker i moderne terminaler.