@egodigital/nef

Managed Extensibility Framework like library written for Node.js

Usage no npm install needed!

<script type="module">
  import egodigitalNef from 'https://cdn.skypack.dev/@egodigital/nef';
</script>

README

npm

NEF (Node.js Extensibility Framework)

Managed Extensibility Framework like library written for Node.js 10+, in TypeScript.

Install

Execute the following command from your project folder, where your package.json file is stored:

npm install --save @egodigital/nef

Usage

Build

# install modules
npm install

# build
npm run build

Requirements

TypeScript

You have to enable decorator feature in your tsconfig.json file:

{
    "compilerOptions": {
        // ...

        "experimentalDecorators": true
    },
    
    // ...
}

Examples

Quick start
Exports

First define a service and a contract:

import { Export } from '@egodigital/nef';

interface IMyService {
    foo(): string;
}

@Export('IMyService') // we have to use a string here, because in TypeScript, Interfaces are virtual and no objects
export class MyService implements IMyService {
    public foo() {
        return 'bar';
    }
}

In that example MyService is the implemented service of IMyService contract.

Imports

Now, implement a class, which gets an instance, exported with IMyService contract, as injected object:

import { Import } from '@egodigital/nef';

export class MyContext {
    @Import('IMyService')
    public service: IMyService;
}
Injections

At the end, the thing, which collects all exports and injects them into object properties, marked with @Import decorators, is an CompositionContainer instance:

import { CompositionContainer } from '@egodigital/nef';

let context = new MyContext();

let container = new CompositionContainer();
container.addClasses(MyService);  // tell explicitly, that 'MyService' is
                                  // a class with an '@Export' decorator

container.composeSync(context);
// now 'context.service' should
// hold an instance of 'MyService' class
// managed by 'container'

Catalogs

Catalogs helps to detect classes, which should be exported as services.

ApplicationCatalog

A catalog based on one or more JavaScript modules one application.

import { ApplicationCatalog, CompositionContainer } from '@egodigital/nef';

let container = new CompositionContainer();
container.addCatalogs(
    new ApplicationCatalog(process)  // add current application
);

// shorter:
// container.addApplications(process);

ClassCatalog

A catalog for a single class.

import { ClassCatalog, CompositionContainer, Export } from '@egodigital/nef';

@Export()
class MyService {
}

let container = new CompositionContainer();
container.addCatalogs(
    new ClassCatalog(MyService)
);

// shorter:
// container.addClasses(MyService);

DirectoryCatalog

A catalog based on one or more JavaScript modules in a directory.

import { CompositionContainer, DirectoryCatalog } from '@egodigital/nef';

let container = new CompositionContainer();
container.addCatalogs(
    new DirectoryCatalog('/path/to/directory')
);

// shorter:
// container.addDirectories('/path/to/directory');

FileCatalog

A catalog based on one or more JavaScript modules in a single file.

import { CompositionContainer, FileCatalog } from '@egodigital/nef';

let container = new CompositionContainer();
container.addCatalogs(
    new FileCatalog('/path/to/file.js')
);

// shorter:
// container.addFiles('/path/to/file.js');

ModuleCatalog

A catalog for a JavaScript module.

import { CompositionContainer, ModuleCatalog } from '@egodigital/nef';
const myModule = require('my-module');

let container = new CompositionContainer();
container.addCatalogs(
    new ModuleCatalog(myModule)
);

// shorter:
// container.addModules(myModule);

Documentation

The API documentation can be found here.