|
All checks were successful
CI / build-lint-test (pull_request) Successful in 34s
pnpm 12.4.2 n'ecrivait pas d'entree importers pour packages/common/service-registry dans le lockfile, meme apres suppression complete du lockfile et du cache d'etat pnpm puis reinstallation (pnpm ls -r reconnaissait pourtant bien le package). CI echouait avec --frozen-lockfile (erreur has no importers[...] entry), alors que le pnpm install local sans --frozen-lockfile ne se plaignait de rien. Cause probable : ce package ne declarait aucune dependency ni devDependency propre. Remede : declarer explicitement quelques devDependencies (typescript, vitest, @types/node via catalog:), meme deja hoistees depuis la racine. create-package.mjs generera desormais ces devDependencies par defaut pour tout nouveau package, et le troubleshooting est documente dans spec/ci-cd.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| src | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
@lightweight-sdk/service-registry
Registre de services en singleton, avec enregistrement et injection par décorateurs. Package common : isomorphe, aucune dépendance DOM ou Node-only.
Installation
pnpm add @lightweight-sdk/service-registry
Usage
import { RegisterService, Service } from '@lightweight-sdk/service-registry';
@RegisterService()
class LoggerService {
public log(message: string): void {
console.log(message);
}
}
class ReportGenerator {
@Service(LoggerService)
private readonly logger!: LoggerService;
public run(): void {
this.logger.log('generating report');
}
}
Concepts
ServiceRepository— singleton central qui stocke une instance unique de chaque service, indexée par un uid généré automatiquement (crypto.randomUUID()) à l'enregistrement. Accès direct rarement nécessaire :RegisterService/Servicecouvrent l'usage courant.@RegisterService()— décorateur de classe. Instancie la classe décorée (constructeur sans argument obligatoire) et l'enregistre dans leServiceRepository.@Service(TargetClass)— décorateur de propriété. Injecte l'instance partagée deTargetClassdans le membre décoré. La résolution est paresseuse (au premier accès à la propriété, pas à la décoration) : peu importe que la classe consommatrice soit évaluée avant ou après l'enregistrement du service. Après le premier accès, la propriété est remplacée par la valeur résolue (pas de nouvelle recherche ensuite).
Contraintes
- Une classe décorée par
@RegisterService()doit avoir un constructeur sans argument obligatoire — ses propres dépendances doivent elles-mêmes être injectées via@Service, pas passées au constructeur. experimentalDecorators: truedoit être activé côté consommateur (déjà le cas dans ce monorepo viatsconfig.base.json).
API
RegisterService()— décorateur de classe.Service(target)— décorateur de propriété.ServiceRepository— singleton (getInstance(),registerClass,resolveClass,resolve,getUidForClass,hasClass).resetForTesting()est réservé aux tests.ServiceConstructor<T>,ServiceUid— types associés.