You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Our current ESLint setup has accumulated technical debt from the JS-to-TS migration:
Problem: packages/config/eslint/juno-typescript.mjs mixes JavaScript and TypeScript rules (lines 35-36 use both pluginJs.configs.recommended and tseslint.configs.recommendedTypeCheckedOnly), causing rule conflicts. Each app works around this by disabling 15-20 TypeScript rules.
Solution: Create a clean, Vite-based TypeScript ESLint configuration (vite-react-ts.mjs) and migrate each app independently. This allows parallel work without coordination overhead and eliminates JS/TS rule interference.
Why it matters:
Improves type safety by re-enabling strict TypeScript checks
Better IDE support and autocomplete
Clearer distinction between intentional overrides vs. workarounds
Objectives
Eliminate JavaScript/TypeScript rule conflicts in shared config
Enable strict TypeScript checking across all apps (re-enable currently disabled rules)
Allow independent, parallelizable migration work per app
Improve developer experience with better type safety and IDE support
Establish clear ESLint conventions for future development
Acceptance Criteria
New packages/config/eslint/vite-react-ts.mjs config exists with pure TypeScript rules
All 7 apps migrated: carbon, doop, greenhouse, heureka, supernova, example, template
Document necessary exceptions with justification comments
Risk mitigation:
Old config stays until all apps migrated (rollback possible)
App-specific overrides allowed with mandatory justifications
Feature branches prevent CI blocking unrelated work
Template PR from apps/example provides pattern for team
Technical details:
Current problematic config structure:
// packages/config/eslint/juno-typescript.mjs (lines 35-36)pluginJs.configs.recommended,// JS rules
...tseslint.configs.recommendedTypeCheckedOnly,// TS rules// ☝️ These conflict with each other
Target clean structure:
// packages/config/eslint/vite-react-ts.mjs
...tseslint.configs.recommendedTypeChecked// Only TS rules// No JS/TS mixing
Questions to resolve before starting:
Should we use Vite's exact ESLint config or customize slightly?
Enforce stricter rules than Vite defaults (e.g., strict: true)?
Which app for template/pilot PR (recommend apps/example)?
Description
Our current ESLint setup has accumulated technical debt from the JS-to-TS migration:
Problem:
packages/config/eslint/juno-typescript.mjsmixes JavaScript and TypeScript rules (lines 35-36 use bothpluginJs.configs.recommendedandtseslint.configs.recommendedTypeCheckedOnly), causing rule conflicts. Each app works around this by disabling 15-20 TypeScript rules.Solution: Create a clean, Vite-based TypeScript ESLint configuration (
vite-react-ts.mjs) and migrate each app independently. This allows parallel work without coordination overhead and eliminates JS/TS rule interference.Why it matters:
Objectives
Acceptance Criteria
packages/config/eslint/vite-react-ts.mjsconfig exists with pure TypeScript rulescarbon,doop,greenhouse,heureka,supernova,example,templateoauth,ui-components,greenhouse-auth-provider,template,communicator,k8s-client,url-state-provider,messages-providerpnpm lintwith new config (CI green)juno-typescript.mjsandjuno.mjsremoved frompackages/configTasks
Phase 1: Foundation
packages/config/eslint/vite-react-ts.mjswith pure TypeScript rules@cloudoperators/juno-configpackagePhase 2: Migration
Each app/package follows this workflow:
eslint.config.mjsApps migration (simplest → most complex):
apps/example(template PR for others to follow)apps/templateapps/doopapps/heurekaapps/supernovaapps/greenhouseapps/carbonPackages migration (parallelizable with apps):
packages/communicatorpackages/k8s-clientpackages/messages-providerpackages/oauthpackages/templatepackages/url-state-providerpackages/greenhouse-auth-providerpackages/ui-components(likely most complex, has Storybook plugin)Phase 3: Cleanup
vite-react-ts.mjspackages/config/eslint/juno-typescript.mjspackages/config/eslint/juno.mjs(if unused)packages/config/package.jsonexportsDependencies
packages/ui-componentsuseseslint-plugin-storybook- the new config must be compatibleAdditional Notes
Strategy: Create new config alongside old one, migrate apps independently, then remove old config.
Per-app workflow details:
eslint.config.mjsto importvite-react-ts.mjspnpm --filter {app} lintto capture violationsno-unused-vars,prefer-const,no-extra-boolean-cast@typescript-eslint/no-unsafe-assignment,no-floating-promises@typescript-eslint/no-unsafe-member-access,no-unsafe-callRisk mitigation:
apps/exampleprovides pattern for teamTechnical details:
Current problematic config structure:
Target clean structure:
Questions to resolve before starting:
strict: true)?apps/example)?