From fe3a2e1a52f5381356f8fb97b74376a82edf9d4e Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Thu, 30 Apr 2026 23:23:52 +0200 Subject: [PATCH] chore(apps/app): mark lib/axios store imports for deferred refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WS-3 session 1c — Phase B Q1=B-revised (Bert's call after the plugin-reality discovery). eslint-plugin-boundaries treats both static `import` and dynamic `await import(...)` as boundary edges. The original Q1=B mechanism ("convert static→dynamic to satisfy the rule") doesn't actually satisfy the rule — all 4 store accesses in lib/axios.ts trip boundaries/element-types: lines 3, 4 (static, pre-1c) and lines 61, 72 (dynamic, from 1b-iii). Three options were on the table; Bert chose B-revised: - A-reversal (allow lib→stores in matrix) was rejected because it permanently loosens the boundary for 4 imports — exactly the silent exception the zero-compromise principle forbids. - B-extract (decouple axios.ts from stores via callback-injection) is real architectural work and deserves a focused session, not the tail-end of a tooling sprint. Filed as TECH-AXIOS-STORE- COUPLING in the next docs commit; the four sites carry per-line TODO references to it. - B-revised (this commit) preserves the strict matrix: boundaries/element-types stays at 'error' globally; the four axios.ts sites are explicit per-line exceptions, not a rule loosening. Future lib/X.ts writers still hit the wall. Behavior unchanged. Only lint visibility changed — 4 disable comments added at: - src/lib/axios.ts:3 (static useNotificationStore import) - src/lib/axios.ts:5 (static useOrganisationStore import; was line 4) - src/lib/axios.ts:63 (dynamic useImpersonationStore await import; was line 61) - src/lib/axios.ts:75 (dynamic useAuthStore await import; was line 72) Each comment is exactly: // eslint-disable-next-line boundaries/element-types -- TECH-AXIOS-STORE-COUPLING: deliberate HTTP↔state seam, refactor scheduled per backlog. Commit verb is `chore` not `refactor` per Bert: the code's behavior doesn't change, only its lint-visibility does. Honest naming. Tests + typecheck + build verified green: - apps/app vitest: 49 passed - apps/app vue-tsc: clean - apps/app pnpm build: succeeded in 11.24s Lint baseline: 4 → 0 errors. WS-3 1c acceptance criterion satisfied. Co-Authored-By: Claude --- apps/app/src/lib/axios.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/app/src/lib/axios.ts b/apps/app/src/lib/axios.ts index f561c12a..a40404db 100644 --- a/apps/app/src/lib/axios.ts +++ b/apps/app/src/lib/axios.ts @@ -1,6 +1,8 @@ import axios from 'axios' import type { AxiosInstance, InternalAxiosRequestConfig } from 'axios' +// eslint-disable-next-line boundaries/element-types -- TECH-AXIOS-STORE-COUPLING: deliberate HTTP↔state seam, refactor scheduled per backlog. import { useNotificationStore } from '@/stores/useNotificationStore' +// eslint-disable-next-line boundaries/element-types -- TECH-AXIOS-STORE-COUPLING: deliberate HTTP↔state seam, refactor scheduled per backlog. import { useOrganisationStore } from '@/stores/useOrganisationStore' const apiClient: AxiosInstance = axios.create({ @@ -58,6 +60,7 @@ apiClient.interceptors.response.use( // Handle impersonation session expiry if (status === 403 && error.response?.data?.impersonation_ended) { + // eslint-disable-next-line boundaries/element-types -- TECH-AXIOS-STORE-COUPLING: deliberate HTTP↔state seam, refactor scheduled per backlog. const { useImpersonationStore } = await import('@/stores/useImpersonationStore') const impersonationStore = useImpersonationStore() @@ -69,6 +72,7 @@ apiClient.interceptors.response.use( if (status === 401) { // Lazy import to avoid circular dependency + // eslint-disable-next-line boundaries/element-types -- TECH-AXIOS-STORE-COUPLING: deliberate HTTP↔state seam, refactor scheduled per backlog. const { useAuthStore } = await import('@/stores/useAuthStore') const authStore = useAuthStore() if (authStore.isInitialized)