feat(arch-rules): JS-016 blocks hardcoded 'en-US' in JS at error severity
Some checks failed
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / ruff (push) Successful in 17s
CI / pytest (push) Has been cancelled

Architecture rule that fails CI on any new toLocaleDateString /
toLocaleString / toLocaleTimeString / new Intl.* call that hardcodes
'en-US' instead of using I18n.locale. The whole codebase was cleaned
in the preceding commits (06e59f73, bb4c4004, dd1f9af8) so the rule
ships at error severity from day one.

- Rule definition in .architecture-rules/frontend.yaml under
  javascript_rules; exceptions: i18n.js (defines the helper), vendor/.
- _check_hardcoded_locale in scripts/validate/validate_architecture.py
  wired into both JS validation sites (full scan + per-file -f mode).
- Suppressible per-line with `// noqa: JS-016` for the rare case where
  a specific locale is genuinely required (e.g., a US-only invoice
  formatter that must use en-US regardless of UI language).

Validator output: 0 JS-016 hits across the codebase. Negative-tested
with a planted violation — rule fires correctly and clears on
removal.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 23:52:14 +02:00
parent bb4c400436
commit eaf180c64f
2 changed files with 77 additions and 0 deletions

View File

@@ -391,6 +391,41 @@ javascript_rules:
exceptions:
- "init-alpine.js"
- id: "JS-016"
name: "Do not hardcode 'en-US' (or any locale) in Intl/toLocale calls"
severity: "error"
description: |
Locale-aware APIs (toLocaleDateString, toLocaleString, toLocaleTimeString,
new Intl.NumberFormat, new Intl.DateTimeFormat, etc.) must NOT receive a
hardcoded locale tag like 'en-US'. The user's dashboard language won't be
respected and dates/numbers will render in English even when FR/DE/LB is
selected.
Use the `I18n.locale` getter from static/shared/js/i18n.js, which returns
the current dashboard language (falls back to 'en' if I18n hasn't loaded).
WRONG (always renders dates in English):
date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
new Intl.NumberFormat('en-US').format(num);
RIGHT:
date.toLocaleDateString(I18n.locale, { year: 'numeric', month: 'short', day: 'numeric' });
new Intl.NumberFormat(I18n.locale).format(num);
Suppress with `// noqa: JS-016` on the line for the rare case where a
specific locale is genuinely required (e.g., a US-only invoice number
formatter that must use en-US regardless of UI language).
pattern:
file_pattern: "static/**/js/**/*.js"
anti_patterns:
- "toLocaleDateString\\(\\s*['\"]en-US['\"]"
- "toLocaleString\\(\\s*['\"]en-US['\"]"
- "toLocaleTimeString\\(\\s*['\"]en-US['\"]"
- "new\\s+Intl\\.\\w+\\(\\s*['\"]en-US['\"]"
exceptions:
- "i18n.js"
- "vendor/"
- id: "JS-012"
name: "Do not include /api/v1 prefix in API endpoints"
severity: "error"