Dependency injection
nisli has built-in DI. Inject a service anywhere in the tree without prop-drilling or module-level globals — and the class itself is the token.
inject
inject(Service) returns a singleton, auto-created on first use. No registration, no provider boilerplate — the class is the token.
import { component, inject, html } from '@nisli/core';
class Clock {
now() { return new Date().toLocaleTimeString(); }
}
component('x-now', () => {
const clock = inject(Clock); // singleton, auto-created
return html`<time>${clock.now()}</time>`;
});
provide
Override what a token resolves to — a mock in tests, or a configured instance. Call provide() before the consumer injects.
import { provide } from '@nisli/core';
provide(Clock, () => ({ now: () => '12:00:00' })); // e.g. in a test
Tokens for non-class values
For values that aren’t classes (config objects, primitives), create a typed token with createToken().
import { createToken, inject, provide } from '@nisli/core';
const ApiUrl = createToken<string>('ApiUrl');
provide(ApiUrl, () => 'https://api.nisli.dev');
const url = inject(ApiUrl);