Systeme de resolution d'imports par dictionnaire pour projets TypeScript/JavaScript.
Remplace les chemins relatifs (../../components/Button) et les alias fragiles (@shared/hooks/useTheme) par des cles semantiques resolues au build-time :
// Avant
import { Button } from '../../components/ui/Button';
import { useTheme } from '@shared/hooks/useTheme';
// Apres
import { Button } from 'app:components/ui/Button';
import { useTheme } from 'app:hooks/useTheme';Dans un projet qui grandit, les imports deviennent un probleme :
- Les chemins relatifs cassent a chaque refactoring (
../../../fragile) - Les alias Vite/Webpack se multiplient (
@shared,@mobile,@seed,@bridge...) - Deplacer un fichier casse des dizaines d'imports
- Les imports ne disent rien sur ce qu'ils importent (quel module ? quelle seed ?)
Le Resolver centralise la connaissance de ou vit chaque module dans un dictionnaire (manifest). Le code n'a plus besoin de connaitre les chemins — il utilise des cles semantiques. Deplacer un fichier = mettre a jour le manifest (1 ligne), pas 50 imports.
# Dry-run : analyse le projet, montre ce qui serait fait
npx tsx Resolver/scripts/setup.ts --root ./mon-projet
# Appliquer : execute toutes les etapes
npx tsx Resolver/scripts/setup.ts --root ./mon-projet --applyLe script setup.ts enchaine automatiquement :
- Analyse du projet → genere
resolver.config.json - Generation du manifest
- Verification de coherence
- Transformation des imports
- Instructions pour brancher le plugin Vite
1. INIT 2. SCAN+MANIFEST 3. CHECK 4. CODEMOD 5. RESOLVE 6. WATCH
┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Analyse │ ──> │ key → path │──>│ Verif │ ──> │ Rewrite │ ──> │ Plugin │ ──> │ Watchdog │
│ projet │ │ + exports │ │ config │ │ imports │ │ Vite │ │ auto │
└──────────┘ └──────────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
init-config.ts generate- check- codemod- vite-resolver- watch-
manifest.ts config.ts imports.ts plugin.ts manifest.ts
npx tsx Resolver/scripts/init-config.ts --root ./mon-projetAnalyse le projet et genere resolver.config.json :
- Detecte les dossiers source (src/, lib/, shared/)
- Detecte les alias tsconfig.json/jsconfig.json
- Detecte les dossiers a exclure (_archives, dist)
- Propose un prefix base sur le package.json
Revoir et ajuster la config avant de continuer.
npx tsx Resolver/scripts/generate-manifest.ts \
--root ./mon-projet \
--config resolver.config.jsonProduit :
resolver-output/resolver-manifest.json— dictionnaire key → path + exportsresolver-output/resolver-reverse.json— lookup inverse export name → keys
npx tsx Resolver/scripts/check-config.ts \
--root ./mon-projet \
--config resolver.config.jsonVerifie :
- Chaque namespace matche au moins 1 fichier
- Tous les fichiers source sont couverts
- Les alias pointent vers des dossiers existants
- Le manifest est a jour (pas d'entrees obsoletes, pas de fichiers oublies)
- Les imports
prefix:dans le code pointent vers des cles existantes
# Dry-run : voir les changements
npx tsx Resolver/scripts/codemod-imports.ts \
--root ./mon-projet \
--config resolver.config.json
# Appliquer
npx tsx Resolver/scripts/codemod-imports.ts \
--root ./mon-projet \
--config resolver.config.json \
--apply
# Limiter a un sous-dossier
npx tsx Resolver/scripts/codemod-imports.ts \
--root ./mon-projet \
--config resolver.config.json \
--apply --dir src/components// vite.config.ts
import { universalResolverPlugin } from './Resolver/scripts/vite-resolver-plugin';
export default defineConfig({
plugins: [
universalResolverPlugin({
projectRoot: __dirname,
manifestPath: './resolver-output/resolver-manifest.json',
prefix: 'app',
overrides: { desktop: 'mobile' }, // optionnel
}),
],
});// vite.config.ts — pour hot-reload automatique du manifest
import { resolverWatchPlugin } from './Resolver/scripts/watch-manifest';
export default defineConfig({
plugins: [
resolverWatchPlugin({
root: __dirname,
config: './resolver.config.json',
}),
// ... autres plugins
],
});Ou en standalone :
npx tsx Resolver/scripts/watch-manifest.ts \
--root ./mon-projet \
--config resolver.config.jsonLe watchdog :
- Surveille les dossiers source via
fs.watch(recursif) - Debounce les changements (300ms par defaut)
- Regenere le manifest quand un fichier .ts/.tsx est cree ou supprime
- Ne regenere PAS pour les modifications de contenu (seul le path compte)
- S'integre comme plugin Vite pour le dev server
Pour que TypeScript accepte les imports prefix:*, ajouter dans un .d.ts :
declare module 'app:*' {}
// ou plus specifique :
declare module 'crane:*' {}Pour les projets multi-plateforme (desktop/mobile), le resolver supporte les redirections automatiques :
{
"overrides": { "desktop": "mobile" }
}Si un import demande app:mobile:Dashboard et qu'un app:desktop:Dashboard existe dans le manifest, le resolver utilise automatiquement la version desktop.
{
"prefix": "app",
"namespaces": [
{ "id": "components", "pattern": "^src/components/(.+)$" },
{ "id": "hooks", "pattern": "^src/hooks/(.+)$" }
],
"aliases": {
"@/": "src/",
"@components/": "src/components/"
},
"exclude": ["_archives", "dist", "stubs"],
"outputDir": "./resolver-output",
"overrides": { "desktop": "mobile" }
}| Champ | Role |
|---|---|
prefix |
Prefixe des imports (app:hooks/useTheme) |
namespaces |
Regles regex ordonnees — premiere qui matche gagne |
aliases |
Mapping des alias existants (pour le codemod) |
exclude |
Dossiers exclus du scan |
outputDir |
Ou ecrire le manifest |
overrides |
Redirections namespace → namespace |
- Refactoring sans casse — deplacer un fichier = 1 ligne dans le manifest
- Imports lisibles —
crane:connector:OrderFlowdit d'ou vient le module - Zero config par fichier — plus d'alias Vite/tsconfig par couche
- Multi-plateforme natif — overrides desktop/mobile sans plugin special
- Indexable — le manifest JSON permet de chercher un export et trouver son module
- Reverse lookup — "qui exporte
useConfigStore?" → reponse immediate - Incrementiel — migration dossier par dossier, anciens imports compatibles
- Watchdog — manifest regenere automatiquement en dev quand des fichiers changent
- All-in-one —
setup.tsfait tout en une commande
- Build-time only — le resolver est un plugin Vite, pas un runtime Node.js (sauf avec loader custom)
- Manifest a regenerer — apres ajout/suppression de fichiers (automatise par le watchdog)
- TypeScript declarations — les imports
prefix:*necessitent undeclare moduleglobal - Codemod imparfait — template literals et imports dynamiques complexes ne sont pas transformes
- Resolution au fichier — la cle pointe vers un fichier, pas un export individuel
- Regex-based — extraction des exports par regex, pas par un parser AST. Les cas exotiques peuvent etre manques
- Packages npm non couverts —
react,zustandrestent en import classique fs.watchrecursive — le watchdog utilise{ recursive: true }qui n'est pas supporte sur tous les OS Linux (OK sur macOS, Windows, et Linux kernel 5.9+)
Resolver/
README.md ← ce fichier
resolver.config.example.json ← config d'exemple
scripts/
setup.ts ← all-in-one pour debutant
init-config.ts ← analyse projet → config
scan-files.ts ← scanner les fichiers source
generate-manifest.ts ← generer le dictionnaire
check-config.ts ← verifier la coherence
codemod-imports.ts ← transformer les imports
vite-resolver-plugin.ts ← plugin Vite resolution
watch-manifest.ts ← watchdog + plugin Vite hot-reload