@nodelibraries/ioc builds your object graph for you. You register each service once, with a lifetime and the tokens of
its dependencies, and ask the container for what you need. It creates instances in the right order, shares them
according to their lifetime and disposes them when a scope ends.
constlogger=await provider.getRequiredService(Logger); // typed as Logger
createToken<
interfaceLogger
Logger>('Logger');
class
classConsoleLogger
ConsoleLoggerimplements
interfaceLogger
Logger {
ConsoleLogger.log(message: string): void
log(
message: string
message:string) {
var console:Console
The console module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
A global console instance configured to write to process.stdout and
process.stderr. The global console can be used without importing the node:console module.
Warning: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the note on process I/O for
more information.
Example using the global console:
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(newError('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
constname='Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
Example using the Console class:
constout=getStreamSomehow();
consterr=getStreamSomehow();
constmyConsole=new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(newError('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
Prints to stdout with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to printf(3)
(the arguments are all passed to util.format()).
Resolves token, throwing ServiceNotFoundError if it is not registered.
getRequiredService(
classUserService
UserService);
constusers:UserService
users.
UserService.list(): string[]
list();
UserService needs a Logger, so it is registered with [Logger]: one token per constructor parameter, in order.
The compiler checks typed tokens in that list against the constructor’s parameter types, and the container checks the count at registration.
Typed errors with the resolution path in the message
No decorators, no reflect-metadata, no compiler plugins. Classes stay plain classes. The package has zero
dependencies, ships ESM and CommonJS builds with type declarations, and runs on Node.js 20 or later (and in browsers:
this site runs it in its playground).