diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..1188679
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,35 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Launch index.html",
+ "type": "chrome",
+ "request": "launch",
+ "file": "index.html"
+ },
+ {
+ "name": "Launch Noosfero NG",
+ "type": "chrome",
+ "request": "launch",
+ "sourceMaps": true,
+ "webRoot": "src/app",
+ "url": "http://localhost:3001/"
+ },
+ {
+ "name": "Launch localhost with sourcemaps",
+ "type": "chrome",
+ "request": "launch",
+ "url": "http://localhost/mypage.html",
+ "sourceMaps": true,
+ "webRoot": "wwwroot"
+ },
+ {
+ "name": "Attach",
+ "type": "chrome",
+ "request": "attach",
+ "sourceMaps": true,
+ "webRoot": "./",
+ "port": 9222
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-scripts/generate-index-modules.ts b/dev-scripts/generate-index-modules.ts
new file mode 100644
index 0000000..3b52b34
--- /dev/null
+++ b/dev-scripts/generate-index-modules.ts
@@ -0,0 +1,33 @@
+import * as glob from "glob";
+import * as path from "path";
+import * as fs from "fs";
+let directories = glob.sync("./src/app/**/**/");
+
+// maps to absolute path
+directories = directories.map((directory: string) => {
+ return path.resolve(__dirname, "..", directory);
+});
+
+// iterate to generate the index folders
+directories.forEach((directory: string) => {
+ // skips the app directory
+ if (!/\/app$/.test(directory)) {
+ let current_files = glob.sync("./*.ts", { nodir: true, cwd: directory, ignore: ['./index.ts', './*.spec.ts'] });
+ console.log("DIRECTORY: ", directory);
+ console.log("FILES: ", current_files);
+
+ let indexPath = path.join(directory, "index.ts");
+
+ let index_ts_content: string = "/* Module Index Entry - generated using the script npm run generate-index */\n";
+
+ let exports_content = current_files.map((file) => {
+ return `export * from "./${path.basename(file, ".ts")}";\n`;
+ });
+
+ fs.writeFileSync(indexPath, index_ts_content + exports_content.join(""));
+
+ }
+
+
+
+});
diff --git a/dev-scripts/node_modules b/dev-scripts/node_modules
new file mode 120000
index 0000000..68a084a
--- /dev/null
+++ b/dev-scripts/node_modules
@@ -0,0 +1 @@
+../node_modules
\ No newline at end of file
diff --git a/dev-scripts/tsconfig.json b/dev-scripts/tsconfig.json
new file mode 100644
index 0000000..6e593a8
--- /dev/null
+++ b/dev-scripts/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es5",
+ "noImplicitAny": false,
+ "sourceMap": true
+ },
+ "exclude": [
+ "node_modules",
+ "typings/browser",
+ "typings/browser.d.ts"
+ ]
+}
\ No newline at end of file
diff --git a/dev-scripts/typings.json b/dev-scripts/typings.json
new file mode 100644
index 0000000..fcd57a9
--- /dev/null
+++ b/dev-scripts/typings.json
@@ -0,0 +1,9 @@
+{
+ "dependencies": {},
+ "devDependencies": {},
+ "ambientDependencies": {
+ "glob": "github:DefinitelyTyped/DefinitelyTyped/glob/glob.d.ts#a14d724826174d1669d4df04c80f4838b7e71fdf",
+ "minimatch": "github:DefinitelyTyped/DefinitelyTyped/minimatch/minimatch.d.ts#a3900b896f7b3361b79f9b503224777619907d53",
+ "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#48c1e3c1d6baefa4f1a126f188c27c4fefd36bff"
+ }
+}
diff --git a/package.json b/package.json
index 67e0f52..2b4cdad 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,8 @@
"scripts": {
"test": "concurrently \"webpack -w\" \"karma start\"",
"postinstall": "npm install -g bower && bower install",
- "start": "concurrently \"webpack -w\" \"gulp serve\""
+ "start": "concurrently \"webpack -w\" \"gulp serve\"",
+ "generate-indexes": "ts-node --project ./dev-scripts ./dev-scripts/generate-index-modules.ts"
},
"devDependencies": {
"browser-sync": "~2.9.11",
@@ -65,6 +66,7 @@
"phantomjs-polyfill": "0.0.2",
"reflect-metadata": "^0.1.3",
"ts-loader": "^0.8.1",
+ "ts-node": "^0.5.5",
"typescript": "^1.8.2",
"typings": "^0.6.8",
"uglify-save-license": "~0.4.1",
diff --git a/src/app/cms/index.ts b/src/app/cms/index.ts
new file mode 100644
index 0000000..2ee57fe
--- /dev/null
+++ b/src/app/cms/index.ts
@@ -0,0 +1,2 @@
+/* Module Index Entry - generated using the script npm run generate-index */
+export * from "./cms.component";
diff --git a/src/app/components/auth/auth_controller.spec.ts b/src/app/components/auth/auth_controller.spec.ts
new file mode 100644
index 0000000..ab31e0e
--- /dev/null
+++ b/src/app/components/auth/auth_controller.spec.ts
@@ -0,0 +1,27 @@
+import {AuthController} from "./auth_controller";
+import {AuthService} from "./auth_service";
+
+describe("AuthController", () => {
+
+ it("calls authenticate on AuthService when login called", () => {
+
+ // creating a Mock AuthService
+ let AuthServiceMock: AuthService = jasmine.createSpyObj("AuthService", ["login"]);
+
+ // pass AuthServiceMock into the constructor
+ let authController = new AuthController(null, null, null, AuthServiceMock);
+
+ // setup of authController -> set the credentials instance property
+ let credentials = { username: "username", password: "password" };
+
+ authController.credentials = credentials;
+
+ // calls the authController login method
+ authController.login();
+
+ // checks if the method login of the injected AuthService has been called
+ expect(AuthServiceMock.login).toHaveBeenCalledWith(credentials);
+
+ });
+
+});
diff --git a/src/app/components/auth/index.ts b/src/app/components/auth/index.ts
new file mode 100644
index 0000000..0f76efa
--- /dev/null
+++ b/src/app/components/auth/index.ts
@@ -0,0 +1,5 @@
+/* Module Index Entry - generated using the script npm run generate-indexes */
+export * from "./auth_controller";
+export * from "./auth_events";
+export * from "./auth_service";
+export * from "./session";
diff --git a/src/app/components/index.ts b/src/app/components/index.ts
new file mode 100644
index 0000000..4206e70
--- /dev/null
+++ b/src/app/components/index.ts
@@ -0,0 +1 @@
+/* Module Index Entry - generated using the script npm run generate-index */
diff --git a/src/app/components/navbar/index.ts b/src/app/components/navbar/index.ts
new file mode 100644
index 0000000..4206e70
--- /dev/null
+++ b/src/app/components/navbar/index.ts
@@ -0,0 +1 @@
+/* Module Index Entry - generated using the script npm run generate-index */
diff --git a/src/app/components/noosfero-activities/activity/index.ts b/src/app/components/noosfero-activities/activity/index.ts
new file mode 100644
index 0000000..4206e70
--- /dev/null
+++ b/src/app/components/noosfero-activities/activity/index.ts
@@ -0,0 +1 @@
+/* Module Index Entry - generated using the script npm run generate-index */
diff --git a/src/app/components/noosfero-activities/index.ts b/src/app/components/noosfero-activities/index.ts
new file mode 100644
index 0000000..4206e70
--- /dev/null
+++ b/src/app/components/noosfero-activities/index.ts
@@ -0,0 +1 @@
+/* Module Index Entry - generated using the script npm run generate-index */
diff --git a/src/app/components/noosfero-articles/article/article_view.spec.ts b/src/app/components/noosfero-articles/article/article_view.spec.ts
index 7f27b15..9e2b9c7 100644
--- a/src/app/components/noosfero-articles/article/article_view.spec.ts
+++ b/src/app/components/noosfero-articles/article/article_view.spec.ts
@@ -1,11 +1,8 @@
-import {TestComponentBuilder} from 'ng-forward/cjs/testing/test-component-builder';
-import {Input, provide, Component} from 'ng-forward';
+import {Input, provide, Component} from 'ng-forward';
import {ArticleView, ArticleDefaultView} from './article_view';
-// Instantiate the Builder, this part is different than ng2.
-// In ng2 you inject tcb.
-const tcb = new TestComponentBuilder();
+import {createComponentFromClass, quickCreateComponent} from "../../../../spec/helpers.ts";
// this htmlTemplate will be re-used between the container components in this spec file
const htmlTemplate: string = '