diff --git a/README.md b/README.md index 641cc0f..747f67c 100644 --- a/README.md +++ b/README.md @@ -21,17 +21,24 @@ simplifies lazy loading with TypeScript We recommend the use of TypeScript for best Intellisense ```typescript -import {LazyModule, loadNow } from 'smartsystem' +import { LazyModule } from 'smartsystem' import * as myPluginType from 'myPlugin' // plugin does not get loaded here at runtime -let myPluginPromised = LazyModule('myPlugin') +let myPluginLazy = new LazyModule('myPlugin') import * as anotherPluginType from 'anotherPlugin' // plugin does not get loaded here at runtime let anotherPluginPromised = LazyModule('anotherPlugin') -myPluginPromised.then(myPlugin => { /* do something with myPlugin */ }) -myPlugin.also(anotherPluginPromised).then((m,a) => {}) // also takes multiple other plugins +myPluginLazy.whenLoaded.then(myPlugin => { + /* do something with myPlugin. + myPlugin receives the typings flow from LazyModule class + This does NOT load the module during runtime + The promise whenLoaded will be resolved whenever load() is called for the first time */ +}) -loadNow.only('myPlugin') // loads myPlugin and resolved the lazy promise -loadNow.also('myPlugin') // loads myPlugin and any chained 'also' modules +myPluginLazy.load().then(myPlugin => { + /* do something with myPlugin. + myPlugin receives the typings flow from LazyModule class + This DOES LOAD the module */ +}) ``` \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 91610b5..a5c3e75 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -5,7 +5,10 @@ import * as q from 'q'; */ export declare class LazyModule { name: string; + nameIsPath: boolean; cwd: string; + whenLoaded: q.Promise; + private whenLoadedDeferred; constructor(nameArg: string, cwdArg?: string); /** * loads the module diff --git a/dist/index.js b/dist/index.js index a768812..0c6d67c 100644 --- a/dist/index.js +++ b/dist/index.js @@ -22,7 +22,10 @@ class LazyModule { constructor(nameArg, cwdArg = process.cwd()) { this.name = nameArg; this.cwd = cwdArg; - smartsystem.addLazyModule(this); + smartsystem.addLazyModule(this); // add module to smartsystem instance + this.nameIsPath = /\.\//.test(this.name); // figure out if name is path + this.whenLoadedDeferred = q.defer(); + this.whenLoaded = this.whenLoadedDeferred.promise; } /** * loads the module @@ -32,8 +35,9 @@ class LazyModule { let loadedModule; systemjs.import(this.name).then((m) => { loadedModule = m; + this.whenLoadedDeferred.resolve(loadedModule); done.resolve(loadedModule); - }); + }).catch(err => { console.log(err); }); return done.promise; } /** @@ -43,4 +47,4 @@ class LazyModule { } } exports.LazyModule = LazyModule; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsdUJBQXNCO0FBQ3RCLDZCQUErQjtBQUMvQixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7QUFFbEM7SUFBQTtRQUNJLGdCQUFXLEdBQUcsSUFBSSxlQUFTLEVBQWMsQ0FBQTtJQVU3QyxDQUFDO0lBUkc7O09BRUc7SUFDSCxhQUFhLENBQUMsYUFBeUI7UUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkMsQ0FBQztDQUdKO0FBRUQsa0NBQWtDO0FBQ2xDLElBQUksV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUE7QUFFbkM7O0dBRUc7QUFDSDtJQUdJLFlBQVksT0FBZSxFQUFFLE1BQU0sR0FBVyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ3ZELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFBO1FBQ2pCLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUssQ0FBQTtRQUN2QixJQUFJLFlBQWUsQ0FBQTtRQUNuQixRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFlBQVksR0FBRyxDQUFDLENBQUE7WUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFHLElBQXVCO0lBRW5DLENBQUM7Q0FDSjtBQTVCRCxnQ0E0QkMifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsdUJBQXNCO0FBQ3RCLDZCQUErQjtBQUMvQixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7QUFFbEM7SUFBQTtRQUNJLGdCQUFXLEdBQUcsSUFBSSxlQUFTLEVBQW1CLENBQUE7SUFRbEQsQ0FBQztJQU5HOztPQUVHO0lBQ0gsYUFBYSxDQUFDLGFBQThCO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7Q0FDSjtBQUVELGtDQUFrQztBQUNsQyxJQUFJLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO0FBRW5DOztHQUVHO0FBQ0g7SUFNSSxZQUFZLE9BQWUsRUFBRSxNQUFNLEdBQVcsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUN2RCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQTtRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQTtRQUNqQixXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMscUNBQXFDO1FBQ3JFLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyw2QkFBNkI7UUFDdEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUssQ0FBQTtRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUE7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUssQ0FBQTtRQUN2QixJQUFJLFlBQWUsQ0FBQTtRQUNuQixRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFlBQVksR0FBRyxDQUFDLENBQUE7WUFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFHLElBQXVCO0lBRW5DLENBQUM7Q0FDSjtBQW5DRCxnQ0FtQ0MifQ== \ No newline at end of file diff --git a/package.json b/package.json index 04bd07a..96f7abf 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ }, "devDependencies": { "@types/should": "^8.1.30", - "should": "^11.1.1" + "should": "^11.1.1", + "typings-test": "^1.0.3" } } diff --git a/test/moduleExample.d.ts b/test/moduleExample.d.ts new file mode 100644 index 0000000..2004672 --- /dev/null +++ b/test/moduleExample.d.ts @@ -0,0 +1 @@ +export declare let exportedTestBoolean: boolean; diff --git a/test/moduleExample.js b/test/moduleExample.js new file mode 100644 index 0000000..fda737c --- /dev/null +++ b/test/moduleExample.js @@ -0,0 +1,4 @@ +"use strict"; +exports.exportedTestBoolean = true; +console.log('moduleExample loaded successfully'); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlRXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vZHVsZUV4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFXLFFBQUEsbUJBQW1CLEdBQUcsSUFBSSxDQUFBO0FBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/test/moduleExample.ts b/test/moduleExample.ts new file mode 100644 index 0000000..cde844d --- /dev/null +++ b/test/moduleExample.ts @@ -0,0 +1,2 @@ +export let exportedTestBoolean = true +console.log('moduleExample loaded successfully') diff --git a/test/test.d.ts b/test/test.d.ts index e69de29..2fd432a 100644 --- a/test/test.d.ts +++ b/test/test.d.ts @@ -0,0 +1 @@ +import 'typings-test'; diff --git a/test/test.js b/test/test.js index 249b44a..b928a04 100644 --- a/test/test.js +++ b/test/test.js @@ -1,2 +1,13 @@ "use strict"; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file +require("typings-test"); +const smartsystem = require("../dist/index"); +describe('smartsystem', function () { + it('should load a module lazily', function (done) { + let lazyModuleExample = new smartsystem.LazyModule('./test/moduleExample.js'); + lazyModuleExample.load().then(m => { + console.log(m.exportedTestBoolean); + done(); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUVyQiw2Q0FBNEM7QUFJNUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUNwQixFQUFFLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxJQUFJO1FBQzVDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUF3Qix5QkFBeUIsQ0FBQyxDQUFBO1FBRXBHLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDbEMsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUEifQ== \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index 7e8e165..237e820 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,2 +1,16 @@ +import 'typings-test' import * as should from 'should' import * as smartsystem from '../dist/index' + +import * as _moduleExample from './moduleExample' + +describe('smartsystem', function () { + it('should load a module lazily', function (done) { + let lazyModuleExample = new smartsystem.LazyModule('./test/moduleExample.js') + + lazyModuleExample.load().then(m => { + console.log(m.exportedTestBoolean) + done() + }) + }) +}) diff --git a/ts/index.ts b/ts/index.ts index 084d130..2fcf860 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -5,16 +5,14 @@ import { Objectmap } from 'lik' let systemjs = require('systemjs') class Smartsystem { - lazyModules = new Objectmap() + lazyModules = new Objectmap>() /** * add lazyModule to Smartsystem */ - addLazyModule(lazyModuleArg: LazyModule) { + addLazyModule(lazyModuleArg: LazyModule) { this.lazyModules.add(lazyModuleArg) } - - loadLazyModule(lazyModuleArg: LazyModule) } // create the internal smartsystem @@ -25,11 +23,17 @@ let smartsystem = new Smartsystem() */ export class LazyModule { name: string + nameIsPath: boolean cwd: string - constructor(nameArg: string, cwdArg: string = process.cwd()){ + whenLoaded: q.Promise + private whenLoadedDeferred: q.Deferred + constructor(nameArg: string, cwdArg: string = process.cwd()) { this.name = nameArg this.cwd = cwdArg - smartsystem.addLazyModule(this) + smartsystem.addLazyModule(this) // add module to smartsystem instance + this.nameIsPath = /\.\//.test(this.name) // figure out if name is path + this.whenLoadedDeferred = q.defer() + this.whenLoaded = this.whenLoadedDeferred.promise } /** @@ -40,8 +44,9 @@ export class LazyModule { let loadedModule: T systemjs.import(this.name).then((m) => { loadedModule = m + this.whenLoadedDeferred.resolve(loadedModule) done.resolve(loadedModule) - }) + }).catch(err => { console.log(err) }) return done.promise }