From ce8e345abdab24f5c5b441542386e6a388130311 Mon Sep 17 00:00:00 2001 From: Samir Boulahtit Date: Sun, 21 Dec 2025 22:02:13 +0100 Subject: [PATCH] fix: add JS-003/JS-004 to full validation + fix Alpine components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The JS-003 and JS-004 rules were only in single-file validation, not in full project validation. Also fixed regex to match functions with parameters (like adminMessages(initialId = null)). Fixed: - messages.js: Added ...data() and currentPage - notifications.js: Added ...data() and currentPage - logs.js: Added noqa (uses baseData pattern with safety check) - settings.js: Added noqa (uses baseData pattern with safety check) - login.js: Added noqa (standalone page, no sidebar) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- scripts/validate_architecture.py | 11 +++++++++-- static/admin/js/login.js | 2 ++ static/admin/js/logs.js | 3 ++- static/admin/js/messages.js | 3 +++ static/admin/js/notifications.js | 3 +++ static/admin/js/settings.js | 3 ++- 6 files changed, 21 insertions(+), 4 deletions(-) diff --git a/scripts/validate_architecture.py b/scripts/validate_architecture.py index 0a6a2352..e26db0a3 100755 --- a/scripts/validate_architecture.py +++ b/scripts/validate_architecture.py @@ -515,10 +515,11 @@ class ArchitectureValidator: if "noqa: js-003" in content.lower(): return - # Look for Alpine component function pattern: function adminXxx() { return { ... } } + # Look for Alpine component function pattern: function adminXxx(...) { return { ... } } # These are page-level components that should inherit from data() + # Allow optional parameters in the function signature component_pattern = re.compile( - r"function\s+(admin\w+|vendor\w+|shop\w+)\s*\(\s*\)\s*\{", re.IGNORECASE + r"function\s+(admin\w+|vendor\w+|shop\w+)\s*\([^)]*\)\s*\{", re.IGNORECASE ) for match in component_pattern.finditer(content): @@ -2641,6 +2642,12 @@ class ArchitectureValidator: suggestion="Replace window.apiClient with apiClient", ) + # JS-003: Check Alpine components spread ...data() + self._check_alpine_data_spread(file_path, content, lines) + + # JS-004: Check Alpine components set currentPage + self._check_alpine_current_page(file_path, content, lines) + def _validate_templates(self, target_path: Path): """Validate template patterns""" print("📄 Validating templates...") diff --git a/static/admin/js/login.js b/static/admin/js/login.js index 8381d257..bfb842e5 100644 --- a/static/admin/js/login.js +++ b/static/admin/js/login.js @@ -1,4 +1,6 @@ // static/admin/js/login.js +// noqa: js-003 - Standalone login page, doesn't use base layout +// noqa: js-004 - No sidebar on login page, doesn't need currentPage // ✅ Use centralized logger - ONE LINE! // Create custom logger for login page diff --git a/static/admin/js/logs.js b/static/admin/js/logs.js index 4f811105..567f5305 100644 --- a/static/admin/js/logs.js +++ b/static/admin/js/logs.js @@ -1,9 +1,10 @@ // static/admin/js/logs.js +// noqa: JS-003 - Uses ...baseData which is data() with safety check const logsLog = window.LogConfig?.loggers?.logs || console; function adminLogs() { - // Get base data + // Get base data with safety check for standalone usage const baseData = typeof data === 'function' ? data() : {}; return { diff --git a/static/admin/js/messages.js b/static/admin/js/messages.js index 5401ee2b..80a963ea 100644 --- a/static/admin/js/messages.js +++ b/static/admin/js/messages.js @@ -15,6 +15,9 @@ const messagesLog = window.LogConfig?.createLogger('MESSAGES') || console; */ function adminMessages(initialConversationId = null) { return { + ...data(), + currentPage: 'messages', + // Loading states loading: true, loadingConversations: false, diff --git a/static/admin/js/notifications.js b/static/admin/js/notifications.js index f95159cf..9dc5db6c 100644 --- a/static/admin/js/notifications.js +++ b/static/admin/js/notifications.js @@ -14,6 +14,9 @@ const notificationsLog = window.LogConfig?.createLogger('NOTIFICATIONS') || cons */ function adminNotifications() { return { + ...data(), + currentPage: 'notifications', + // Loading states loading: true, loadingNotifications: false, diff --git a/static/admin/js/settings.js b/static/admin/js/settings.js index d2c508fe..b310f93f 100644 --- a/static/admin/js/settings.js +++ b/static/admin/js/settings.js @@ -1,9 +1,10 @@ // static/admin/js/settings.js +// noqa: JS-003 - Uses ...baseData which is data() with safety check const settingsLog = window.LogConfig?.loggers?.settings || console; function adminSettings() { - // Get base data + // Get base data with safety check for standalone usage const baseData = typeof data === 'function' ? data() : {}; return {