kits

0.0.11 • Public • Published

kits

This is a kits pattern. Main idea of this to have registry and lightweight injections.

Idea is:

    let kit = Kit({
        name: () => 'slava',
        user: ({name}) => `My name is ${name}`
    });
    // console.log(kit.user) // My name is slava
    
    assert(kit.user === 'My name is slava');

Async kits here now: https://www.npmjs.com/package/kits-async.

Spec

const assert = require('assert');
const Kit = require('kits');
 
describe('Kit', () => {
    it('example', () => {
        let kit = Kit({
            name: () => 'slava',
            user: ({name}) => `My name is ${name}`
        });
        // console.log(kit.user) // My name is slava
 
        assert(kit.user === 'My name is slava');
    });
 
    it('construct and get', () => {
 
        let kit = Kit({
            Component: () => 'component-value'
        });
 
        assert.equal(kit.Component, 'component-value');
        assert.equal(kit.get('Component'), 'component-value');
 
        assert.equal(kit.NoComponent, undefined);
        assert.equal(kit.get('NoComponent'), undefined);
    })
 
    it('get - array of arguments', () => {
 
        let kit = Kit({
            Component1: () => 'component1',
            Component2: () => 'component2'
        });
 
        assert.deepEqual(kit.get(['Component1', 'Component2']), ['component1', 'component2']);
    })
 
    it('add - adds creator', () => {
 
        let kit = Kit();
 
        kit.add('Component', () => 'component')
 
        assert.equal(kit.Component, 'component');
        assert.equal(kit.get('Component'), 'component');
 
        assert.equal(kit.NoComponent, undefined);
        assert.equal(kit.get('NoComponent'), undefined);
    });
 
    it('create - should return new instance', () => {
 
        let kit = Kit();
 
        class TestComponent {
        }
 
        kit.add('Component', () => new TestComponent());
 
        assert.equal(kit.Component, kit.Component);
        assert.equal(kit.Component, kit.get('Component'));
 
        assert.notEqual(kit.Component, kit.create('Component'));
        assert(kit.get('Component') instanceof TestComponent);
 
        assert.notEqual(kit.create('Component'), kit.create('Component'));
    });
 
    it('creator - should be function', () => {
 
        return Promise.resolve()
            .then(() => {
                let kit = Kit();
                kit.add('Component', 'component');
            })
            .catch((err) => {
                assert.equal(err.message, "'Component' : creator is not a function");
            });
    });
 
 
    it('remove - should remove previous version', () => {
 
        let kit = Kit();
 
        class TestComponent {
        }
 
        kit.add('Component', () => new TestComponent());
 
        let Component = kit.Component;
        assert.equal(Component, kit.Component);
 
        kit.remove('Component');
        assert.equal(kit.Component, undefined);
    });
 
    it('get - should provide options in creator', () => {
        let kit = Kit();
 
        class TestComponent {
            constructor(options) {
                this.options = options;
            }
        }
 
        kit.add('Component', ({Options}) => new TestComponent(Options));
 
        kit.add('Options', () => {
            return {
                name: 'test',
                version: 1
            };
        });
 
        assert.deepEqual(kit.Component.options, {
            name: 'test',
            version: 1
        });
 
        assert.deepEqual(kit.Options, {
            name: 'test',
            version: 1
        });
 
        let {Options} = kit;
        assert.deepEqual(Options, {
            name: 'test',
            version: 1
        });
    });
 
    it('add - should remove previous value', () => {
 
        let kit = Kit();
 
        class TestComponent {
        }
 
        kit.add('Component', () => new TestComponent());
        assert(kit.Component instanceof TestComponent);
 
        kit.add('Component', () => 'value');
 
        assert.equal(kit.Component, 'value');
    });
 
    it('set - is alias for add', () => {
 
        let kit = Kit();
 
        class TestComponent {
        }
 
        kit.set('Component', () => new TestComponent());
        assert(kit.Component instanceof TestComponent);
 
        kit.set('Component', () => 'value');
        assert.equal(kit.Component, 'value');
    });
 
    it('defineDecorator - wrapper', () => {
        let kit = Kit({
            Component: () => 'component'
        });
 
        kit.defineDecorator((value, name) => `${value} -> ${name}`);
 
        assert.equal(kit.Component, 'component -> Component');
    });
 
    it('clone', () => {
 
        class TestComponent {
        }
 
        let kit = Kit({
            Component: () => new TestComponent()
        });
 
        let kit2 = Kit(kit);
 
        assert(kit.Component instanceof TestComponent);
        assert(kit2.Component instanceof TestComponent);
 
        assert.notEqual(kit.Component, kit2.Component);
    })
 
    it('es6 nested access', () => {
        let kit = Kit({
            user: () => {
                return {
                    name: 'slava'
                };
            },
            name: ({user: {name}}) => name
        });
 
        assert.equal(kit.name, 'slava');
    })
 
});

ES5

const Kit = require('kits/es5');

Readme

Keywords

Package Sidebar

Install

npm i kits

Weekly Downloads

1

Version

0.0.11

License

ISC

Last publish

Collaborators

  • slava.hatnuke