Nationwide Polamorous Matrimony

    noicejs
    TypeScript icon, indicating that this package has built-in type declarations

    5.0.0-2 • Public • Published

    noicejs

    Extremely thin, async dependency injection, now with a getting started guide.

    Inspired by Google's Guice library and written in Typescript.

    Features

    • async dependency resolution
    • constructor and property injection
    • modular containers with inheritance
    • named dependencies using strings or unique symbols
    • typed errors
    • typescript typedefs
    • zero runtime dependencies, bundled or otherwise
    • extensive test coverage

    Contents

    Status

    Pipeline status Lines of Code Test coverage MIT license FOSSA Status

    Open bug count Open issue count Closed issue count

    Renovate badge Dependency status Dev dependency status Known vulnerabilities

    Maintainability score Technical debt ratio Quality issues Language grade: JavaScript Total alerts

    Releases

    • 3.x versions are compatible with Node 12+
    • 4.x versions are compatible with Node 16+

    github release link github release version github commits since release

    npm package link npm release version Typescript definitions

    Usage

    Consider a Server class that needs to fetch data from the Cache and Filesystem, but doesn't know (or need to know) how those are implemented. The following example is also part of the unit tests.

    import { LocalModule } from './local';
    import { NetworkModule } from './network';
    
    class Cache {
      public get(path: string, ttl: number, fallback: () => Promise<string>): Promise<string> {
        /* ... */
      }
    }
    
    class Filesystem {
      public get(path: string): Promise<string> {
        /* ... */
      }
    }
    
    /**
     * Constructors, strings, and symbols are supported. Symbols are
     * preferred, as the most unique, but names can be convenient.
     */
    @Inject(Cache.name.toLowerCase(), Filesystem.name.toLowerCase())
    class Server {
      protected readonly cache: Cache;
      protected readonly filesystem: Filesystem;
      protected readonly ttl: number;
    
      constructor(options) {
        this.cache = options.cache;
        this.filesystem = options.filesystem;
        this.ttl = defaultTo(options.ttl, 0);
      }
    
      get(path: string) {
        return options.cache.get(path, this.ttl, () => options.filesystem.get(path));
      }
    }
    
    const TEST_TTL = 60;
    
    function module() {
      if (process.env['DEBUG'] === 'TRUE') {
        return new LocalModule();
      } else {
        return new NetworkModule();
      }
    }
    
    async function main() {
      const container = Container.from(module());
      await container.configure();
    
      const server = await container.create(Server, {
        /* cache and filesystem are found and injected by container */
        ttl: TEST_TTL,
      });
    
      /* server.cache.get and server.filesystem.get will be called in order */
      const result = await server.get('some/file');
    }

    noicejs will collect dependencies from the decorated constructor and any superclasses, find a provider for each injected dependency, and asynchronously resolve them before calling the constructor. Any extra parameters are passed on to the original constructor, along with the container and resolved dependencies.

    Build

    To build a bundle and run tests:

    > make
    
    yarn
    yarn install v1.17.3
    [1/4] Resolving packages...
    success Already up-to-date.
    Done in 0.20s.
    /home/ssube/code/ssube/noicejs//node_modules/.bin/rollup --config /home/ssube/code/ssube/noicejs//config/rollup.js
    
    src/index.ts, test/harness.ts, test/**/Test*.ts → out/...
    ...
    created out/ in 3.3s
    /home/ssube/code/ssube/noicejs//node_modules/.bin/api-extractor run --config /home/ssube/code/ssube/noicejs//config/api-extractor.json --local -v
    
    api-extractor 7.3.8  - https://api-extractor.com/
    ...
    
    API Extractor completed successfully
    Success!

    License

    FOSSA Status

    Install

    npm i noicejs

    DownloadsWeekly Downloads

    81

    Version

    5.0.0-2

    License

    MIT

    Unpacked Size

    568 kB

    Total Files

    299

    Last publish

    Collaborators

    • ssube
    • apexsvcs