13 Commits

Author SHA1 Message Date
3098fbec89 1.0.12 2016-12-11 11:01:07 +01:00
1caa8a7c31 improve README 2016-12-11 11:00:58 +01:00
c689a3c349 update npmextra.json 2016-12-10 22:15:22 +01:00
a8a0778708 1.0.11 2016-12-10 22:12:38 +01:00
82ebb181a0 update README 2016-12-10 22:12:24 +01:00
adabcb3c4a 1.0.10 2016-12-10 19:46:52 +01:00
32db51c49a update to latest standards 2016-12-10 19:46:47 +01:00
62b91adf0e 1.0.9 2016-10-14 04:08:43 +02:00
2f6a56c857 improve README 2016-10-14 04:08:38 +02:00
988cf907a4 1.0.8 2016-10-14 03:28:18 +02:00
18d79cb403 improve README 2016-10-14 03:27:52 +02:00
1d2c073206 1.0.7 2016-10-14 03:24:32 +02:00
fa85e689df add npm as default module loader 2016-10-14 03:24:29 +02:00
8 changed files with 55 additions and 33 deletions

View File

@ -20,14 +20,18 @@ simplifies lazy loading with TypeScript
## Usage ## Usage
We recommend the use of TypeScript for best Intellisense We recommend the use of TypeScript for best Intellisense
```typescript smartsystem supports both npm and SystemJs as module loader.
```javascript
import { LazyModule } from 'smartsystem' import { LazyModule } from 'smartsystem'
import * as _myPlugin from 'myPlugin' // plugin does not get loaded here at runtime import * as _myPlugin from 'myPlugin' // plugin does not get loaded here at runtime
let myPluginLazy = new LazyModule<typeof _myPlugin>('myPlugin') let myPluginLazy = new LazyModule<typeof _myPlugin>('myPlugin')
myPluginLazy.setLoader('npm') // sets the loader, defaults to npm anyway
import * as _anotherPlugin from 'anotherPlugin' // plugin does not get loaded here at runtime import * as _anotherPlugin from 'anotherPlugin' // plugin does not get loaded here at runtime
let anotherPluginLazy = new LazyModule<typeof _anotherPlugin>('anotherPlugin') let anotherPluginLazy = new LazyModule<typeof _anotherPlugin>('anotherPlugin')
anotherPluginLazy.setLoader('systemjs') // sets the loader to systemjs
myPluginLazy.whenLoaded.then(myPlugin => { myPluginLazy.whenLoaded.then(myPlugin => {
/* do something with myPlugin. /* do something with myPlugin.
@ -42,3 +46,5 @@ myPluginLazy.load().then(myPlugin => {
This DOES LOAD the module */ This DOES LOAD the module */
}) })
``` ```
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks)

2
dist/index.d.ts vendored
View File

@ -12,7 +12,7 @@ export declare class LazyModule<T> {
whenLoaded: q.Promise<T>; whenLoaded: q.Promise<T>;
loader: TLoader; loader: TLoader;
private whenLoadedDeferred; private whenLoadedDeferred;
constructor(nameArg: string, cwdArg?: string); constructor(nameArg: string, cwdArg: string);
setLoader(loaderArg: TLoader): void; setLoader(loaderArg: TLoader): void;
/** /**
* loads the module * loads the module

23
dist/index.js vendored
View File

@ -3,7 +3,6 @@ require("typings-global");
const path = require("path"); const path = require("path");
const q = require("q"); const q = require("q");
const lik_1 = require("lik"); const lik_1 = require("lik");
let systemjs = require('systemjs');
class Smartsystem { class Smartsystem {
constructor() { constructor() {
this.lazyModules = new lik_1.Objectmap(); this.lazyModules = new lik_1.Objectmap();
@ -18,8 +17,11 @@ class Smartsystem {
// create the internal smartsystem // create the internal smartsystem
let smartsystem = new Smartsystem(); let smartsystem = new Smartsystem();
class LazyModule { class LazyModule {
constructor(nameArg, cwdArg = process.cwd()) { constructor(nameArg, cwdArg) {
this.loader = 'npm'; this.loader = 'npm';
if (!cwdArg) {
throw new Error('You must specify a directory to resolve from!');
}
this.name = nameArg; this.name = nameArg;
this.cwd = cwdArg; this.cwd = cwdArg;
smartsystem.addLazyModule(this); // add module to smartsystem instance smartsystem.addLazyModule(this); // add module to smartsystem instance
@ -39,18 +41,21 @@ class LazyModule {
load() { load() {
let done = q.defer(); let done = q.defer();
let loadedModule; let loadedModule;
let loadingPath;
if (this.loader === 'npm') { if (this.loader === 'npm') {
loadingPath = require.resolve(this.name); loadedModule = require(this.name);
done.resolve(loadedModule);
} }
else { else if (this.loader === 'systemjs') {
loadingPath = this.name; let systemjs = require('systemjs');
} systemjs.import(this.name).then((m) => {
systemjs.import(loadingPath).then((m) => {
loadedModule = m; loadedModule = m;
this.whenLoadedDeferred.resolve(loadedModule); this.whenLoadedDeferred.resolve(loadedModule);
done.resolve(loadedModule); done.resolve(loadedModule);
}).catch(err => { console.log(err); }); }).catch(err => { console.log(err); });
}
else {
throw Error('loader not supported');
}
return done.promise; return done.promise;
} }
/** /**
@ -60,4 +65,4 @@ class LazyModule {
} }
} }
exports.LazyModule = LazyModule; exports.LazyModule = LazyModule;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBRXZCLDZCQUE0QjtBQUM1Qix1QkFBc0I7QUFDdEIsNkJBQStCO0FBQy9CLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUVsQztJQUFBO1FBQ0ksZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBbUIsQ0FBQTtJQVFsRCxDQUFDO0lBTkc7O09BRUc7SUFDSCxhQUFhLENBQUMsYUFBOEI7UUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkMsQ0FBQztDQUNKO0FBRUQsa0NBQWtDO0FBQ2xDLElBQUksV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUE7QUFRbkM7SUFPSSxZQUFZLE9BQWUsRUFBRSxNQUFNLEdBQVcsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUYzRCxXQUFNLEdBQVksS0FBSyxDQUFBO1FBR25CLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFBO1FBQ2pCLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxxQ0FBcUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLDZCQUE2QjtRQUN0RSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFLLENBQUE7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFBO0lBQ3JELENBQUM7SUFFRCxTQUFTLENBQUMsU0FBa0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUssQ0FBQTtRQUN2QixJQUFJLFlBQWUsQ0FBQTtRQUNuQixJQUFJLFdBQW1CLENBQUE7UUFDdkIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM1QyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUMzQixDQUFDO1FBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLFlBQVksR0FBRyxDQUFDLENBQUE7WUFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFHLElBQXVCO0lBRW5DLENBQUM7Q0FDSjtBQWpERCxnQ0FpREMifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBRXZCLDZCQUE0QjtBQUM1Qix1QkFBc0I7QUFDdEIsNkJBQStCO0FBRS9CO0lBQUE7UUFDSSxnQkFBVyxHQUFHLElBQUksZUFBUyxFQUFtQixDQUFBO0lBUWxELENBQUM7SUFORzs7T0FFRztJQUNILGFBQWEsQ0FBQyxhQUE4QjtRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0NBQ0o7QUFFRCxrQ0FBa0M7QUFDbEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQTtBQVFuQztJQU9JLFlBQVksT0FBZSxFQUFFLE1BQWM7UUFGM0MsV0FBTSxHQUFZLEtBQUssQ0FBQTtRQUduQixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUE7UUFDcEUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFBO1FBQ2pCLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxxQ0FBcUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLDZCQUE2QjtRQUN0RSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFLLENBQUE7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFBO0lBQ3JELENBQUM7SUFFRCxTQUFTLENBQUMsU0FBa0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSTtRQUNBLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUssQ0FBQTtRQUN2QixJQUFJLFlBQWUsQ0FBQTtRQUNuQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEIsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM5QixDQUFDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDbEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDOUIsWUFBWSxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUM5QixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6QyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsR0FBRyxJQUF1QjtJQUVuQyxDQUFDO0NBQ0o7QUF0REQsZ0NBc0RDIn0=

7
npmextra.json Normal file
View File

@ -0,0 +1,7 @@
{
"npmci": {
"globalNpmTools": [
"npmts"
]
}
}

View File

@ -1,6 +1,6 @@
{ {
"name": "smartsystem", "name": "smartsystem",
"version": "1.0.6", "version": "1.0.12",
"description": "simplifies lazy loading with TypeScript", "description": "simplifies lazy loading with TypeScript",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
@ -24,14 +24,14 @@
"homepage": "https://gitlab.com/pushrocks/smartsystem#README", "homepage": "https://gitlab.com/pushrocks/smartsystem#README",
"dependencies": { "dependencies": {
"@types/q": "0.0.32", "@types/q": "0.0.32",
"lik": "^1.0.24", "lik": "^1.0.27",
"q": "^1.4.1", "q": "^1.4.1",
"systemjs": "^0.19.39", "systemjs": "^0.19.41",
"typings-global": "^1.0.14" "typings-global": "^1.0.14"
}, },
"devDependencies": { "devDependencies": {
"@types/should": "^8.1.30", "@types/should": "^8.1.30",
"should": "^11.1.1", "should": "^11.1.2",
"typings-test": "^1.0.3" "typings-test": "^1.0.3"
} }
} }

View File

@ -3,11 +3,11 @@ require("typings-test");
const smartsystem = require("../dist/index"); const smartsystem = require("../dist/index");
describe('smartsystem', function () { describe('smartsystem', function () {
it('should load a module lazily', function (done) { it('should load a module lazily', function (done) {
let lazyModuleExample = new smartsystem.LazyModule('./test/moduleExample.js'); let lazyModuleExample = new smartsystem.LazyModule('../test/moduleExample.js', __dirname);
lazyModuleExample.load().then(m => { lazyModuleExample.load().then(m => {
console.log(m.exportedTestBoolean); console.log(m.exportedTestBoolean);
done(); done();
}); });
}); });
}); });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUVyQiw2Q0FBNEM7QUFJNUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUNwQixFQUFFLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxJQUFJO1FBQzVDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUF3Qix5QkFBeUIsQ0FBQyxDQUFBO1FBRXBHLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDbEMsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUEifQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUVyQiw2Q0FBNEM7QUFJNUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUNwQixFQUFFLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxJQUFJO1FBQzVDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUF3QiwwQkFBMEIsRUFBQyxTQUFTLENBQUMsQ0FBQTtRQUUvRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1lBQ2xDLElBQUksRUFBRSxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFBIn0=

View File

@ -6,7 +6,7 @@ import * as _moduleExample from './moduleExample'
describe('smartsystem', function () { describe('smartsystem', function () {
it('should load a module lazily', function (done) { it('should load a module lazily', function (done) {
let lazyModuleExample = new smartsystem.LazyModule<typeof _moduleExample>('./test/moduleExample.js') let lazyModuleExample = new smartsystem.LazyModule<typeof _moduleExample>('../test/moduleExample.js',__dirname)
lazyModuleExample.load().then(m => { lazyModuleExample.load().then(m => {
console.log(m.exportedTestBoolean) console.log(m.exportedTestBoolean)

View File

@ -3,7 +3,6 @@ import 'typings-global'
import * as path from 'path' import * as path from 'path'
import * as q from 'q' import * as q from 'q'
import { Objectmap } from 'lik' import { Objectmap } from 'lik'
let systemjs = require('systemjs')
class Smartsystem { class Smartsystem {
lazyModules = new Objectmap<LazyModule<any>>() lazyModules = new Objectmap<LazyModule<any>>()
@ -32,7 +31,10 @@ export class LazyModule<T> {
whenLoaded: q.Promise<T> whenLoaded: q.Promise<T>
loader: TLoader = 'npm' loader: TLoader = 'npm'
private whenLoadedDeferred: q.Deferred<T> private whenLoadedDeferred: q.Deferred<T>
constructor(nameArg: string, cwdArg: string = process.cwd()) { constructor(nameArg: string, cwdArg: string) {
if (!cwdArg) {
throw new Error('You must specify a directory to resolve from!')
}
this.name = nameArg this.name = nameArg
this.cwd = cwdArg this.cwd = cwdArg
smartsystem.addLazyModule(this) // add module to smartsystem instance smartsystem.addLazyModule(this) // add module to smartsystem instance
@ -54,17 +56,19 @@ export class LazyModule<T> {
load(): q.Promise<T> { load(): q.Promise<T> {
let done = q.defer<T>() let done = q.defer<T>()
let loadedModule: T let loadedModule: T
let loadingPath: string
if (this.loader === 'npm') { if (this.loader === 'npm') {
loadingPath = require.resolve(this.name) loadedModule = require(this.name)
} else { done.resolve(loadedModule)
loadingPath = this.name } else if (this.loader === 'systemjs') {
} let systemjs = require('systemjs')
systemjs.import(loadingPath).then((m) => { systemjs.import(this.name).then((m) => {
loadedModule = m loadedModule = m
this.whenLoadedDeferred.resolve(loadedModule) this.whenLoadedDeferred.resolve(loadedModule)
done.resolve(loadedModule) done.resolve(loadedModule)
}).catch(err => { console.log(err) }) }).catch(err => { console.log(err) })
} else {
throw Error('loader not supported')
}
return done.promise return done.promise
} }