lightweight-sdk/packages/common/service-registry
Nicolas f0f57f170c
All checks were successful
CI / build-lint-test (pull_request) Successful in 34s
Corriger pnpm-lock.yaml : entree manquante pour service-registry
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>
2026-09-18 14:06:19 +02:00
..
src Ajouter @lightweight-sdk/service-registry (packages/common) 2026-09-18 13:59:58 +02:00
package.json Corriger pnpm-lock.yaml : entree manquante pour service-registry 2026-09-18 14:06:19 +02:00
README.md Ajouter @lightweight-sdk/service-registry (packages/common) 2026-09-18 13:59:58 +02:00
tsconfig.json Ajouter @lightweight-sdk/service-registry (packages/common) 2026-09-18 13:59:58 +02:00

@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/Service couvrent l'usage courant.
  • @RegisterService() — décorateur de classe. Instancie la classe décorée (constructeur sans argument obligatoire) et l'enregistre dans le ServiceRepository.
  • @Service(TargetClass) — décorateur de propriété. Injecte l'instance partagée de TargetClass dans 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: true doit être activé côté consommateur (déjà le cas dans ce monorepo via tsconfig.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.