diff --git a/decorators/inject/.gitignore b/decorators/inject/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/decorators/inject/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/decorators/inject/.keepme b/decorators/inject/.keepme deleted file mode 100644 index e69de29..0000000 diff --git a/decorators/inject/dependencies.ts b/decorators/inject/dependencies.ts new file mode 100644 index 0000000..cded41b --- /dev/null +++ b/decorators/inject/dependencies.ts @@ -0,0 +1,4 @@ +import {Injectable} from './injectable'; +export interface Dependencies { + providers: Array; +} diff --git a/decorators/inject/index.d.ts b/decorators/inject/index.d.ts new file mode 100644 index 0000000..32db988 --- /dev/null +++ b/decorators/inject/index.d.ts @@ -0,0 +1,2 @@ +export function Inject(): any; +export function fireLoopBootstrap(): any; \ No newline at end of file diff --git a/decorators/inject/index.js b/decorators/inject/index.js new file mode 100644 index 0000000..5f58b32 --- /dev/null +++ b/decorators/inject/index.js @@ -0,0 +1,91 @@ +"use strict"; +/** + * @author Andres Jimenez Fork from @mean-expert/boot-script by Jonathan Casarrubias + * @module Inject Decorator + * @license MIT + * @description + * This decorator will return singleton instances + * This avoids the need of creating static Injects + **/ +var prepared = []; +function Inject(dependencies) { + 'use strict'; + var args = []; + Array.prototype.push.apply(args, dependencies.providers); + // return the function specified by ts documentation + return function (target) { + // the new constructor behaviour + var f = function () { + // prepre holder for instances + var instances = []; + // retrive instance of the class + for (var _i = 0, _a = f._dependencies; _i < _a.length; _i++) { + var entry = _a[_i]; + instances.push(instanceiateDependency(f, entry)); + } + // apply to original target constructor + target.apply(this, instances); + f._instance = this; + }; + // loop all the providers and attach who is providing them + for (var _i = 0, _a = dependencies.providers; _i < _a.length; _i++) { + var provider = _a[_i]; + // check if any providing is there + if (provider._providing === undefined) { + provider._providing = []; + } + // save reference to this class + provider._providing.push(f); + } + // copy prototype + f.prototype = target.prototype; + f._dependencies = args; + prepared.push(f); + return f; + }; +} +exports.Inject = Inject; +function instanceiateDependency(caller, target) { + 'use strict'; + // temp reference to instances + var temp; + // check if an instances exists + if (target._instance === undefined) { + // create new instance + target._instance = new target(); + // check if any classes should be enabled first + if (target._providing !== undefined) { + // if caller is not allowed basically + if (target._providing.indexOf(caller) === -1) { + // create new instances of them first + for (var _i = 0, _a = target._providing; _i < _a.length; _i++) { + var provider = _a[_i]; + temp = new provider(); + } + // delete all stuff about providing + delete target._providing; + } + } + } + return target._instance; +} +function fireLoopBootstrap(main) { + 'use strict'; + var tmp; + // start everything + for (var _i = 0, prepared_1 = prepared; _i < prepared_1.length; _i++) { + var entry = prepared_1[_i]; + // start only if not allready started + if (entry._instance === undefined) { + tmp = new entry(); + } + } + // start instance + if (main._instance === undefined) { + this.main = new main(); + } + else { + this.main = main._instance; + } +} +exports.fireLoopBootstrap = fireLoopBootstrap; diff --git a/decorators/inject/index.js.map b/decorators/inject/index.js.map new file mode 100644 index 0000000..9302c1b --- /dev/null +++ b/decorators/inject/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAOA;IACI,WAAW,MAAW;QAElB,4BAA4B,SAAc;YAEtC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,CAAM,kBAAkB,CAAC;IACnC,CAAC;IACD,MAAM,CAAC,CAAC,CAAA;AACZ,CAAC;AAVe,kBAAU,aAUzB,CAAA"} diff --git a/decorators/inject/index.ts b/decorators/inject/index.ts new file mode 100644 index 0000000..b3a06b9 --- /dev/null +++ b/decorators/inject/index.ts @@ -0,0 +1,127 @@ +import { Dependencies } from './dependencies'; +import { Injectable } from './injectable'; + +/** + * @author Andres Jimenez Fork from @mean-expert/boot-script by Jonathan Casarrubias + * @module Inject Decorator + * @license MIT + * @description + * This decorator will return singleton instances + * This avoids the need of creating static Injects + **/ +let prepared: Array = []; + +export function Inject(dependencies: Dependencies): Function { + 'use strict'; + + let args: Array = []; + + Array.prototype.push.apply(args, dependencies.providers); + + // return the function specified by ts documentation + return (target: any) => { + + // the new constructor behaviour + let f: any = function (): any { + + // prepre holder for instances + let instances: Array = []; + + // retrive instance of the class + for (let entry of f._dependencies) { + instances.push(instanceiateDependency(f, entry)); + } + + // apply to original target constructor + target.apply(this, instances); + f._instance = this; + }; + + + // loop all the providers and attach who is providing them + for (let provider of dependencies.providers) { + + // check if any providing is there + if (provider._providing === undefined) { + provider._providing = []; + } + + // save reference to this class + provider._providing.push(f); + } + + // copy prototype + f.prototype = target.prototype; + f._dependencies = args; + + prepared.push(f); + + return f; + }; +} + +function instanceiateDependency(caller: Injectable, target: Injectable): any { + + 'use strict'; + + // temp reference to instances + let temp: any; + + // check if an instances exists + if (target._instance === undefined) { + + // create new instance + target._instance = new target(); + + // check if any classes should be enabled first + if (target._providing !== undefined) { + + // if caller is not allowed basically + if (target._providing.indexOf(caller) === -1) { + + // create new instances of them first + for (let provider of target._providing) { + + temp = new provider(); + } + + // delete all stuff about providing + delete target._providing; + } + } + } + + return target._instance; +} + + +/** + * Propouse this function for the bootstrap instance of the app loopback/fireLoopBootstrap + * with typescript, but dependens of migration server.js to typescript. + * + * @export + * @param {Injectable} main + */ +export function fireLoopBootstrap(main: Injectable): void { + + 'use strict'; + + let tmp: any; + + // start everything + for (let entry of prepared) { + + // start only if not allready started + if (entry._instance === undefined) { + + tmp = new entry(); + } + } + + // start instance + if (main._instance === undefined) { + this.main = new main(); + } else { + this.main = main._instance; + } +} \ No newline at end of file diff --git a/decorators/inject/injectable.ts b/decorators/inject/injectable.ts new file mode 100644 index 0000000..3725285 --- /dev/null +++ b/decorators/inject/injectable.ts @@ -0,0 +1,6 @@ +export interface Injectable extends Function { + new(...args: Array): any; + _instance?: any; + _dependencies?: Array; + _providing?: Array; +} \ No newline at end of file diff --git a/decorators/inject/package.json b/decorators/inject/package.json new file mode 100644 index 0000000..6639c64 --- /dev/null +++ b/decorators/inject/package.json @@ -0,0 +1,35 @@ +{ + "name": "@mean-expert/inject", + "version": "1.0.0", + "description": "FireLoop Inject Decorator", + "main": "index.js", + "types": "index.d.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "files": [ + "index.js", + "index.js.map", + "index.d.ts", + "package.json" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/mean-expert-official/boot-script.git" + }, + "keywords": [ + "index.js", + "index.js.map", + "index.d.ts", + "package.json" + ], + "author": "Jonathan Casarrubias", + "license": "MIT", + + "bugs": { + "url": "https://github.com/mean-expert-official/boot-script/issues" + }, + "homepage": "https://github.com/mean-expert-official/boot-script#readme", + "dependencies": {}, + "devDependencies": {} +} diff --git a/decorators/inject/tsconfig.json b/decorators/inject/tsconfig.json new file mode 100644 index 0000000..d0c11e9 --- /dev/null +++ b/decorators/inject/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "moduleResolution": "node", + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true + }, + "files": [ + "index.ts" + ] +} \ No newline at end of file