diff --git a/di-lite/di-lite-test.ts b/di-lite/di-lite-test.ts
new file mode 100644
index 000000000..8d6bfb777
--- /dev/null
+++ b/di-lite/di-lite-test.ts
@@ -0,0 +1,139 @@
+///
+
+interface Dependency {
+ dependencies?: string;
+}
+
+function doTest(test: (ctx: any, ...obj: Dependency[]) => void) {
+ // create di context
+ var ctx = di.createContext(),
+ A: Dependency = () => {
+ this.dependencies = "b, c";
+ },
+ B: Dependency = () => {
+ this.dependencies = "c";
+ },
+ C: Dependency = () => {};
+
+ // register a class with an unique name
+ ctx.register("a", A);
+ ctx.register("b", B);
+ ctx.register("c", C);
+
+ test(ctx, A, B, C);
+}
+
+module BasicWiring {
+ doTest(ctx => {
+ // initialize di container so all singleton(default) objects will be wired at this stage
+ ctx.initialize();
+
+ var instanceOfA = ctx.get("a");
+ instanceOfA.b === ctx.get("b"); // true
+ instanceOfA.c === ctx.get("c"); // true
+
+ var instanceOfB = ctx.get("b");
+ instanceOfB.c === ctx.get("c"); // true
+ });
+}
+
+module WiringWithAssignment {
+ doTest((ctx, A) => {
+ A.dependencies = "bee=b, c"; // mix explicit and implicit assignment
+
+ ctx.initialize();
+
+ var instanceOfA = ctx.get("a");
+ instanceOfA.bee === ctx.get("b"); // true - explicit assignment
+ instanceOfA.c === ctx.get("c"); // true - implicit assignment
+ });
+}
+
+module PassiveDependencyResolution {
+ doTest((ctx, A) => {
+ ctx.register("a", A);
+ ctx.get("a"); // this triggers the dependency resolution for "a" alone
+ ctx.initialize();
+ });
+}
+
+module PrototypeStrategy {
+ doTest((ctx, A) => {
+ ctx.register("prototype", A).strategy(di.strategy.proto);
+ ctx.get("prototype") === ctx.get("prototype"); // false
+ ctx.create("prototype", 100); // create can be used if you want to explicitly pass in a new parameter
+ });
+}
+
+module PassingConstructorArguments {
+ class ProfileView { }
+
+ doTest(ctx => {
+ ctx.register("str", String, "hello world"); // signle simple argument
+ ctx.register("profileView", ProfileView, { el: "#profile_div" }); // signle object literal argument
+ ctx.register("array", Array, ["Saab", "Volvo", "BMW"]); // multiple argument is passed in using an array
+ });
+}
+
+module CyclicalDependency {
+ doTest((ctx, A, B) => {
+ A.dependencies = "b";
+ B.dependencies = "a";
+
+ ctx.register("a", A);
+ ctx.register("b", B);
+
+ ctx.initialize();
+
+ ctx.get("a").b === ctx.get("b"); // true
+ ctx.get("b").a === ctx.get("a"); // true
+ ctx.get("a").b.a === ctx.get("a"); // true
+ ctx.get("b").a.b === ctx.get("b"); // true
+ });
+}
+
+module FunctionalObject {
+ doTest(ctx => {
+ var FuncObject = (spec: any) => {
+ var that = {};
+ return that;
+ },
+ spec: any = [];
+
+ ctx.register("funcObjSingleton", FuncObject, spec).factory(di.factory.func);
+
+ // function chaining can be used to customize your object registration
+ ctx.register("funcObjProto", FuncObject, spec)
+ .strategy(di.strategy.proto)
+ .factory(di.factory.func);
+
+ ctx.initialize();
+
+ ctx.get("funcObjSingleton"); // will return you a signleton instance of FuncObject
+ ctx.get("funcObjProto"); // will return you a new instance of FuncObject each time
+ });
+}
+
+module RuntimeDependenciesOverride {
+ doTest((ctx, A) => {
+ ctx.register("a", A)
+ .dependencies("bee=b"); // dependencies specified here will take precedence
+ ctx.get("a").bee === ctx.get("b"); // true
+ });
+}
+
+module CreateYourOwn {
+ class Backbone {
+ history: History = new History();
+ }
+
+ class History {
+ start() {}
+ }
+
+ doTest(ctx => {
+ ctx.register("history").object(new Backbone().history);
+ ctx.get("history").start(); // you can use it since it is already created and initialized
+ ctx.initialize(); // initialize the rest of the objects
+ });
+}
diff --git a/di-lite/di-lite.d.ts b/di-lite/di-lite.d.ts
new file mode 100644
index 000000000..356f70c7b
--- /dev/null
+++ b/di-lite/di-lite.d.ts
@@ -0,0 +1,69 @@
+// Type definitions for di-lite 0.3.3
+// Project: https://github.com/NickQiZhu/di.js
+// Definitions by: Timothy Morris
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare module DiLite {
+ interface DiLiteStatic {
+ version: string;
+ createContext(): CreateContext;
+ dependencyExpression(depExp: string): string;
+ entry(name: string, ctx: CreateContext): any;
+ strategy: StrategyEnum;
+ factory: FactoryEnum;
+ utils: Utils;
+ }
+
+ interface Dictionary {
+ [index: string]: T;
+ }
+
+ interface CreateContext {
+ map: Dictionary;
+ entry(name: string): T;
+ register(name: string, service: T): Entry;
+ has(name: string): boolean;
+ get(name: string): any;
+ create(name: string, args: any): T;
+ initialize(): void;
+ clear(): void;
+ inject(name: string, o: T, dependencies: string): T;
+ ready(o: Function): T;
+ ready(o: any): T;
+ }
+
+ interface Entry {
+ create(newArgs: any): Entry;
+ object(o: T): Entry;
+ object(): T;
+ strategy(s: Function): Entry;
+ strategy(): T;
+ type(t: T): Entry;
+ type(): T;
+ dependencies(d: T): Entry;
+ dependencies(): T;
+ args(a: T): Entry;
+ args(): T;
+ factory(f: Function): Entry;
+ factory(): T;
+ }
+
+ interface StrategyEnum {
+ proto(name: string, object: TObject, type: TType, args: any, ctx: CreateContext, dependencies: any): TObject;
+ singleton(name: string, object: TObject, type: TType, args: any, ctx?: CreateContext, dependencies?: any): TObject;
+ }
+
+ interface FactoryEnum {
+ constructor(type: T, args: any): T;
+ func(type: T, args: any): T;
+ }
+
+ interface Utils {
+ invokeStmt(args: any, op: string): string;
+ }
+}
+
+declare module "di-lite" {
+ export = di;
+}
+declare var di: DiLite.DiLiteStatic;