diff --git a/.babelrc.karma b/.babelrc.karma deleted file mode 100644 index 22f9024..0000000 --- a/.babelrc.karma +++ /dev/null @@ -1,11 +0,0 @@ - { - "presets": [ "es2015" ], - "plugins": [ - ["istanbul", { - "exclude": [ - "src/specs.js", - "src/**/*_spec.js" - ] - }] - ] - } diff --git a/.gitignore b/.gitignore index fea770a..d6dd45f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ artifacts build node_modules +/typings npm-debug.log diff --git a/.travis.yml b/.travis.yml index 6ad82d0..6895abd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,10 +21,12 @@ before_install: install: - npm install gulp --global + - npm install typings --global - npm install codecov --global before_script: - npm install + - typings install script: - gulp lint diff --git a/karma.conf.js b/karma.conf.js index 1809269..d27f9fb 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,5 +1,6 @@ +const webpack = require('./webpack-test.config'); + module.exports = function(config) { - const webpack = require('./webpack-test.config')(config); config.set({ diff --git a/package.json b/package.json index 0fde20c..69b64ea 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,8 @@ "sass-loader": "^4.0.2", "sinon": "^1.17.6", "style-loader": "^0.13.1", + "ts-loader": "^0.8.2", + "typescript": "^2.0.0", "url-loader": "^0.5.7", "webpack": "^1.13.2", "webpack-combine-loaders": "^2.0.0", diff --git a/src/app.js b/src/app.js deleted file mode 100644 index 99e9012..0000000 --- a/src/app.js +++ /dev/null @@ -1,7 +0,0 @@ -import './style.scss'; - -import angular from 'angular'; -import bootstrap from './app/bootstrap'; - -angular.injector(['ng']) - .invoke(bootstrap); diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..d50e997 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,12 @@ +/// +/// +/// +/// + +import './style.scss'; + +import * as angular from 'angular'; +import bootstrap from './app/bootstrap'; + +angular.injector(['ng']) + .invoke(bootstrap); diff --git a/src/app/about/module.js b/src/app/about/module.ts similarity index 81% rename from src/app/about/module.js rename to src/app/about/module.ts index d7fd156..08dd4e3 100644 --- a/src/app/about/module.js +++ b/src/app/about/module.ts @@ -1,4 +1,4 @@ -import angular from 'angular'; +import * as angular from 'angular'; import states from './states/config'; import uiRouter from 'angular-ui-router'; diff --git a/src/app/about/states/config.js b/src/app/about/states/config.ts similarity index 100% rename from src/app/about/states/config.js rename to src/app/about/states/config.ts diff --git a/src/app/about/states/main/state.js b/src/app/about/states/main/state.ts similarity index 50% rename from src/app/about/states/main/state.js rename to src/app/about/states/main/state.ts index 5571b7e..826d7d5 100644 --- a/src/app/about/states/main/state.js +++ b/src/app/about/states/main/state.ts @@ -1,8 +1,6 @@ -import template from './template.html'; - export default { name: 'about', - template, + template: require('./template.html'), url: '/about' }; diff --git a/src/app/about/states/main/state_spec.js b/src/app/about/states/main/state_spec.ts similarity index 92% rename from src/app/about/states/main/state_spec.js rename to src/app/about/states/main/state_spec.ts index 44abadd..24d9668 100644 --- a/src/app/about/states/main/state_spec.js +++ b/src/app/about/states/main/state_spec.ts @@ -1,3 +1,4 @@ +import * as angular from 'angular'; import { expect } from 'chai'; import module from '../../module'; diff --git a/src/app/bootstrap.js b/src/app/bootstrap.ts similarity index 69% rename from src/app/bootstrap.js rename to src/app/bootstrap.ts index 74840e2..706c0e7 100644 --- a/src/app/bootstrap.js +++ b/src/app/bootstrap.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; +import * as angular from 'angular'; import module from './module'; -export default function($document) { +export default function($document: JQuery) { 'ngInject'; angular.element($document).ready(() => { diff --git a/src/app/bootstrap_spec.js b/src/app/bootstrap_spec.ts similarity index 72% rename from src/app/bootstrap_spec.js rename to src/app/bootstrap_spec.ts index 720295c..d41f607 100644 --- a/src/app/bootstrap_spec.js +++ b/src/app/bootstrap_spec.ts @@ -1,17 +1,17 @@ -import angular from 'angular'; +import * as angular from 'angular'; import bootstrap from './bootstrap'; import { expect } from 'chai'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe('boostrap', () => { - let sandbox; + let sandbox, stub; beforeEach(() => { sandbox = sinon.sandbox.create(); // Do not boot the app in the test environment - sandbox.stub(angular, 'bootstrap'); + stub = sandbox.stub(angular, 'bootstrap'); }); afterEach(() => { @@ -25,9 +25,9 @@ describe('boostrap', () => { $injector.invoke(bootstrap); angular.element($document).ready(() => { - expect(angular.bootstrap.called).to.be.true; + expect(stub.called).to.be.true; - const [, modules, options] = angular.bootstrap.lastCall.args; + const [, modules, options] = stub.lastCall.args; expect(modules[0]).to.eq('app'); expect(options).to.have.property('strictDi', true); diff --git a/src/app/commons/components/config.js b/src/app/commons/components/config.ts similarity index 100% rename from src/app/commons/components/config.js rename to src/app/commons/components/config.ts diff --git a/src/app/commons/components/footer/component.js b/src/app/commons/components/footer/component.js deleted file mode 100644 index 70fc48b..0000000 --- a/src/app/commons/components/footer/component.js +++ /dev/null @@ -1,5 +0,0 @@ -import template from './template.html'; - -export default { - template -}; diff --git a/src/app/commons/components/footer/component.ts b/src/app/commons/components/footer/component.ts new file mode 100644 index 0000000..e0cb004 --- /dev/null +++ b/src/app/commons/components/footer/component.ts @@ -0,0 +1,3 @@ +export default { + template: require('./template.html') +}; diff --git a/src/app/commons/components/navigation/component.js b/src/app/commons/components/navigation/component.js deleted file mode 100644 index 70fc48b..0000000 --- a/src/app/commons/components/navigation/component.js +++ /dev/null @@ -1,5 +0,0 @@ -import template from './template.html'; - -export default { - template -}; diff --git a/src/app/commons/components/navigation/component.ts b/src/app/commons/components/navigation/component.ts new file mode 100644 index 0000000..e0cb004 --- /dev/null +++ b/src/app/commons/components/navigation/component.ts @@ -0,0 +1,3 @@ +export default { + template: require('./template.html') +}; diff --git a/src/app/commons/module.js b/src/app/commons/module.ts similarity index 71% rename from src/app/commons/module.js rename to src/app/commons/module.ts index 4b81a1c..99700d7 100644 --- a/src/app/commons/module.js +++ b/src/app/commons/module.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; +import * as angular from 'angular'; +import * as toastr from 'angular-toastr'; import components from './components/config'; import services from './services/config'; -import toastr from 'angular-toastr'; export default angular.module('app.commons', [ toastr diff --git a/src/app/commons/services/alert/service.js b/src/app/commons/services/alert/service.ts similarity index 61% rename from src/app/commons/services/alert/service.js rename to src/app/commons/services/alert/service.ts index 9a46fbd..fe583fc 100644 --- a/src/app/commons/services/alert/service.js +++ b/src/app/commons/services/alert/service.ts @@ -1,4 +1,4 @@ -export default function($window) { +export default function($window: ng.IWindowService) { 'ngInject'; return function(message) { diff --git a/src/app/commons/services/alert/service_spec.js b/src/app/commons/services/alert/service_spec.ts similarity index 93% rename from src/app/commons/services/alert/service_spec.js rename to src/app/commons/services/alert/service_spec.ts index 79c4914..5eac449 100644 --- a/src/app/commons/services/alert/service_spec.js +++ b/src/app/commons/services/alert/service_spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe(`module: ${module}`, () => { diff --git a/src/app/commons/services/config.js b/src/app/commons/services/config.ts similarity index 100% rename from src/app/commons/services/config.js rename to src/app/commons/services/config.ts diff --git a/src/app/commons/services/confirm/service.js b/src/app/commons/services/confirm/service.ts similarity index 62% rename from src/app/commons/services/confirm/service.js rename to src/app/commons/services/confirm/service.ts index d030801..c3ddd8a 100644 --- a/src/app/commons/services/confirm/service.js +++ b/src/app/commons/services/confirm/service.ts @@ -1,4 +1,4 @@ -export default function($window) { +export default function($window: ng.IWindowService) { 'ngInject'; return function(message) { diff --git a/src/app/commons/services/confirm/service_spec.js b/src/app/commons/services/confirm/service_spec.ts similarity index 87% rename from src/app/commons/services/confirm/service_spec.js rename to src/app/commons/services/confirm/service_spec.ts index e30443f..27215bd 100644 --- a/src/app/commons/services/confirm/service_spec.js +++ b/src/app/commons/services/confirm/service_spec.ts @@ -1,6 +1,7 @@ +import * as angular from 'angular'; import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe(`module: ${module}`, () => { diff --git a/src/app/config.js b/src/app/config.ts similarity index 85% rename from src/app/config.js rename to src/app/config.ts index b0061a9..82340dc 100644 --- a/src/app/config.js +++ b/src/app/config.ts @@ -1,5 +1,3 @@ -import template404 from './404.html'; - export function router($urlMatcherFactoryProvider, $urlRouterProvider) { 'ngInject'; @@ -12,7 +10,7 @@ export function notFoundState($stateProvider, $urlRouterProvider) { $stateProvider .state('404', { - template: template404 + template: require('./404.html') }); $urlRouterProvider.otherwise(($injector) => { diff --git a/src/app/contacts/components/config.js b/src/app/contacts/components/config.ts similarity index 100% rename from src/app/contacts/components/config.js rename to src/app/contacts/components/config.ts diff --git a/src/app/contacts/components/contact_form/component.js b/src/app/contacts/components/contact_form/component.ts similarity index 75% rename from src/app/contacts/components/contact_form/component.js rename to src/app/contacts/components/contact_form/component.ts index fdf4e6a..922bb5a 100644 --- a/src/app/contacts/components/contact_form/component.js +++ b/src/app/contacts/components/contact_form/component.ts @@ -1,5 +1,4 @@ import controller from './controller'; -import template from './template.html'; export default { bindings: { @@ -7,5 +6,5 @@ export default { onSubmit: '&' }, controller: controller, - template + template: require('./template.html') }; diff --git a/src/app/contacts/components/contact_form/component_spec.js b/src/app/contacts/components/contact_form/component_spec.ts similarity index 97% rename from src/app/contacts/components/contact_form/component_spec.js rename to src/app/contacts/components/contact_form/component_spec.ts index 5f2caeb..68deb86 100644 --- a/src/app/contacts/components/contact_form/component_spec.js +++ b/src/app/contacts/components/contact_form/component_spec.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; +import * as angular from 'angular'; import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe(`module: ${module}`, () => { diff --git a/src/app/contacts/components/contact_form/controller.js b/src/app/contacts/components/contact_form/controller.ts similarity index 75% rename from src/app/contacts/components/contact_form/controller.js rename to src/app/contacts/components/contact_form/controller.ts index 2dcabea..ffc99eb 100644 --- a/src/app/contacts/components/contact_form/controller.js +++ b/src/app/contacts/components/contact_form/controller.ts @@ -1,10 +1,15 @@ -import angular from 'angular'; +import * as angular from 'angular'; export default class { - constructor($q) { + contact: any; + originalContact: any; + onSubmit: Function; + + saving: boolean; + + constructor(private $q) { 'ngInject'; - this.$q = $q; this.saving = false; } diff --git a/src/app/contacts/components/favourite_button/component.js b/src/app/contacts/components/favourite_button/component.ts similarity index 68% rename from src/app/contacts/components/favourite_button/component.js rename to src/app/contacts/components/favourite_button/component.ts index e9151e8..d7650b7 100644 --- a/src/app/contacts/components/favourite_button/component.js +++ b/src/app/contacts/components/favourite_button/component.ts @@ -1,10 +1,9 @@ import controller from './controller'; -import template from './template.html'; export default { bindings: { contact: '=' }, controller, - template + template: require('./template.html') }; diff --git a/src/app/contacts/components/favourite_button/component_spec.js b/src/app/contacts/components/favourite_button/component_spec.ts similarity index 96% rename from src/app/contacts/components/favourite_button/component_spec.js rename to src/app/contacts/components/favourite_button/component_spec.ts index 3eedaee..a90d3fa 100644 --- a/src/app/contacts/components/favourite_button/component_spec.js +++ b/src/app/contacts/components/favourite_button/component_spec.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; +import * as angular from 'angular'; import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe(`module: ${module}`, () => { diff --git a/src/app/contacts/components/favourite_button/controller.js b/src/app/contacts/components/favourite_button/controller.ts similarity index 88% rename from src/app/contacts/components/favourite_button/controller.js rename to src/app/contacts/components/favourite_button/controller.ts index 05b9e5c..fe1680c 100644 --- a/src/app/contacts/components/favourite_button/controller.js +++ b/src/app/contacts/components/favourite_button/controller.ts @@ -1,5 +1,8 @@ export default class { + contact: any; + saving: boolean; + $onInit() { this.saving = false; } diff --git a/src/app/contacts/components/favourite_button/controller_spec.js b/src/app/contacts/components/favourite_button/controller_spec.ts similarity index 95% rename from src/app/contacts/components/favourite_button/controller_spec.js rename to src/app/contacts/components/favourite_button/controller_spec.ts index 971e35d..e4e955a 100644 --- a/src/app/contacts/components/favourite_button/controller_spec.js +++ b/src/app/contacts/components/favourite_button/controller_spec.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; +import * as angular from 'angular'; import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe(`module: ${module}`, () => { diff --git a/src/app/contacts/module.js b/src/app/contacts/module.ts similarity index 73% rename from src/app/contacts/module.js rename to src/app/contacts/module.ts index e55a873..d35a7fa 100644 --- a/src/app/contacts/module.js +++ b/src/app/contacts/module.ts @@ -1,6 +1,6 @@ -import angular from 'angular'; -import angularMessages from 'angular-messages'; -import angularResource from 'angular-resource'; +import * as angular from 'angular'; +import * as angularMessages from 'angular-messages'; +import * as angularResource from 'angular-resource'; import appCommons from '../commons/module'; import components from './components/config'; import services from './services/config'; diff --git a/src/app/contacts/services/config.js b/src/app/contacts/services/config.ts similarity index 100% rename from src/app/contacts/services/config.js rename to src/app/contacts/services/config.ts diff --git a/src/app/contacts/services/contact/factory.js b/src/app/contacts/services/contact/factory.ts similarity index 95% rename from src/app/contacts/services/contact/factory.js rename to src/app/contacts/services/contact/factory.ts index c091e2c..b095d1f 100644 --- a/src/app/contacts/services/contact/factory.js +++ b/src/app/contacts/services/contact/factory.ts @@ -1,4 +1,4 @@ -import angular from 'angular'; +import * as angular from 'angular'; import { extend } from '../../../utils'; export default function($resource) { diff --git a/src/app/contacts/services/contact/factory_spec.js b/src/app/contacts/services/contact/factory_spec.ts similarity index 100% rename from src/app/contacts/services/contact/factory_spec.js rename to src/app/contacts/services/contact/factory_spec.ts diff --git a/src/app/contacts/states/config.js b/src/app/contacts/states/config.ts similarity index 100% rename from src/app/contacts/states/config.js rename to src/app/contacts/states/config.ts diff --git a/src/app/contacts/states/edit/controller.js b/src/app/contacts/states/edit/controller.ts similarity index 79% rename from src/app/contacts/states/edit/controller.js rename to src/app/contacts/states/edit/controller.ts index a00dd51..a1cb590 100644 --- a/src/app/contacts/states/edit/controller.js +++ b/src/app/contacts/states/edit/controller.ts @@ -1,10 +1,9 @@ export default class { - constructor($state, toastr, contact) { - 'ngInject'; + contact: any; - this.$state = $state; - this.toastr = toastr; + constructor(private $state, private toastr, contact) { + 'ngInject'; this.contact = contact; } diff --git a/src/app/contacts/states/edit/controller_spec.js b/src/app/contacts/states/edit/controller_spec.ts similarity index 97% rename from src/app/contacts/states/edit/controller_spec.js rename to src/app/contacts/states/edit/controller_spec.ts index 1022e50..9d4bf88 100644 --- a/src/app/contacts/states/edit/controller_spec.js +++ b/src/app/contacts/states/edit/controller_spec.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; +import * as angular from 'angular'; import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; import toastrMockModule from '../../../../specs/toastr_mock_module'; describe(`module: ${module}`, () => { diff --git a/src/app/contacts/states/edit/state.js b/src/app/contacts/states/edit/state.ts similarity index 85% rename from src/app/contacts/states/edit/state.js rename to src/app/contacts/states/edit/state.ts index dceb663..e50f1cd 100644 --- a/src/app/contacts/states/edit/state.js +++ b/src/app/contacts/states/edit/state.ts @@ -1,5 +1,4 @@ import controller from './controller'; -import template from './template.html'; function contact($stateParams, Contact) { 'ngInject'; @@ -18,6 +17,6 @@ export default { contact }, - template, + template: require('./template.html'), url: '/:id/edit' }; diff --git a/src/app/contacts/states/edit/state_spec.js b/src/app/contacts/states/edit/state_spec.ts similarity index 100% rename from src/app/contacts/states/edit/state_spec.js rename to src/app/contacts/states/edit/state_spec.ts diff --git a/src/app/contacts/states/list/controller.js b/src/app/contacts/states/list/controller.ts similarity index 80% rename from src/app/contacts/states/list/controller.js rename to src/app/contacts/states/list/controller.ts index 38bb315..3dd2fdd 100644 --- a/src/app/contacts/states/list/controller.js +++ b/src/app/contacts/states/list/controller.ts @@ -1,5 +1,7 @@ export default class { + contacts: Array; + constructor(contacts) { 'ngInject'; diff --git a/src/app/contacts/states/list/controller_spec.js b/src/app/contacts/states/list/controller_spec.ts similarity index 94% rename from src/app/contacts/states/list/controller_spec.js rename to src/app/contacts/states/list/controller_spec.ts index c6f887f..5e533fa 100644 --- a/src/app/contacts/states/list/controller_spec.js +++ b/src/app/contacts/states/list/controller_spec.ts @@ -23,7 +23,7 @@ describe(`module: ${module}`, () => { })); it('has an array of contacts', () => { - expect(ctrl.contacts).to.be.an.array; + expect(ctrl.contacts).to.be.an.instanceOf(Array); expect(ctrl.contacts).to.have.length(2); expect(ctrl.contacts[0]).to.have.property('id', 1); diff --git a/src/app/contacts/states/list/state.js b/src/app/contacts/states/list/state.ts similarity index 82% rename from src/app/contacts/states/list/state.js rename to src/app/contacts/states/list/state.ts index 21b8805..cefa55c 100644 --- a/src/app/contacts/states/list/state.js +++ b/src/app/contacts/states/list/state.ts @@ -1,5 +1,4 @@ import controller from './controller'; -import template from './template.html'; function contacts(Contact) { 'ngInject'; @@ -16,6 +15,6 @@ export default { contacts }, - template, + template: require('./template.html'), url: '/' }; diff --git a/src/app/contacts/states/list/state_spec.js b/src/app/contacts/states/list/state_spec.ts similarity index 94% rename from src/app/contacts/states/list/state_spec.js rename to src/app/contacts/states/list/state_spec.ts index 1d905b7..90df207 100644 --- a/src/app/contacts/states/list/state_spec.js +++ b/src/app/contacts/states/list/state_spec.ts @@ -30,7 +30,7 @@ describe(`module: ${module}`, () => { ]}); $resolve.resolve(state.resolve).then(({ contacts }) => { - expect(contacts).to.be.an.array; + expect(contacts).to.be.an.instanceOf(Array); expect(contacts).to.have.length(2); expect(contacts[0]).to.have.property('id', 10); expect(contacts[1]).to.have.property('id', 11); diff --git a/src/app/contacts/states/new/controller.js b/src/app/contacts/states/new/controller.ts similarity index 79% rename from src/app/contacts/states/new/controller.js rename to src/app/contacts/states/new/controller.ts index e8ca13e..a0f9bcb 100644 --- a/src/app/contacts/states/new/controller.js +++ b/src/app/contacts/states/new/controller.ts @@ -1,10 +1,9 @@ export default class { - constructor($state, toastr, contact) { - 'ngInject'; + contact: any; - this.$state = $state; - this.toastr = toastr; + constructor(private $state, private toastr, contact) { + 'ngInject'; this.contact = contact; } diff --git a/src/app/contacts/states/new/controller_spec.js b/src/app/contacts/states/new/controller_spec.ts similarity index 97% rename from src/app/contacts/states/new/controller_spec.js rename to src/app/contacts/states/new/controller_spec.ts index 8bf1104..897af20 100644 --- a/src/app/contacts/states/new/controller_spec.js +++ b/src/app/contacts/states/new/controller_spec.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; +import * as angular from 'angular'; import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; import toastrMockModule from '../../../../specs/toastr_mock_module'; describe(`module: ${module}`, () => { diff --git a/src/app/contacts/states/new/state.js b/src/app/contacts/states/new/state.ts similarity index 82% rename from src/app/contacts/states/new/state.js rename to src/app/contacts/states/new/state.ts index 7b2239a..8c6ee05 100644 --- a/src/app/contacts/states/new/state.js +++ b/src/app/contacts/states/new/state.ts @@ -1,5 +1,4 @@ import controller from './controller'; -import template from './template.html'; function contact(Contact) { 'ngInject'; @@ -16,6 +15,6 @@ export default { contact }, - template, + template: require('./template.html'), url: '/new' }; diff --git a/src/app/contacts/states/new/state_spec.js b/src/app/contacts/states/new/state_spec.ts similarity index 100% rename from src/app/contacts/states/new/state_spec.js rename to src/app/contacts/states/new/state_spec.ts diff --git a/src/app/contacts/states/show/controller.js b/src/app/contacts/states/show/controller.ts similarity index 71% rename from src/app/contacts/states/show/controller.js rename to src/app/contacts/states/show/controller.ts index f8372e8..5cdadd3 100644 --- a/src/app/contacts/states/show/controller.js +++ b/src/app/contacts/states/show/controller.ts @@ -1,11 +1,9 @@ export default class { - constructor($state, confirm, toastr, contact) { - 'ngInject'; + contact: any; - this.$state = $state; - this.confirm = confirm; - this.toastr = toastr; + constructor(private $state, private confirm, private toastr, contact) { + 'ngInject'; this.contact = contact; } diff --git a/src/app/contacts/states/show/controller_spec.js b/src/app/contacts/states/show/controller_spec.ts similarity index 98% rename from src/app/contacts/states/show/controller_spec.js rename to src/app/contacts/states/show/controller_spec.ts index 9e27a53..32c9794 100644 --- a/src/app/contacts/states/show/controller_spec.js +++ b/src/app/contacts/states/show/controller_spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; import toastrMockModule from '../../../../specs/toastr_mock_module'; describe(`module: ${module}`, () => { diff --git a/src/app/contacts/states/show/state.js b/src/app/contacts/states/show/state.ts similarity index 85% rename from src/app/contacts/states/show/state.js rename to src/app/contacts/states/show/state.ts index 55b7acd..5ac8b4c 100644 --- a/src/app/contacts/states/show/state.js +++ b/src/app/contacts/states/show/state.ts @@ -1,5 +1,4 @@ import controller from './controller'; -import template from './template.html'; function contact($stateParams, Contact) { 'ngInject'; @@ -18,6 +17,6 @@ export default { contact }, - template, + template: require('./template.html'), url: '/:id' }; diff --git a/src/app/contacts/states/show/state_spec.js b/src/app/contacts/states/show/state_spec.ts similarity index 100% rename from src/app/contacts/states/show/state_spec.js rename to src/app/contacts/states/show/state_spec.ts diff --git a/src/app/home/module.js b/src/app/home/module.ts similarity index 86% rename from src/app/home/module.js rename to src/app/home/module.ts index dc0acd5..786f7e3 100644 --- a/src/app/home/module.js +++ b/src/app/home/module.ts @@ -1,7 +1,7 @@ -import angular from 'angular'; -import commonsModule from '../commons/module'; +import * as angular from 'angular'; import states from './states/config'; import uiRouter from 'angular-ui-router'; +import commonsModule from '../commons/module'; export default angular.module('app.home', [ uiRouter, diff --git a/src/app/home/states/config.js b/src/app/home/states/config.ts similarity index 100% rename from src/app/home/states/config.js rename to src/app/home/states/config.ts diff --git a/src/app/home/states/main/controller.js b/src/app/home/states/main/controller.ts similarity index 72% rename from src/app/home/states/main/controller.js rename to src/app/home/states/main/controller.ts index e6b6227..a027ffc 100644 --- a/src/app/home/states/main/controller.js +++ b/src/app/home/states/main/controller.ts @@ -1,9 +1,10 @@ export default class { - constructor(alert) { + message: string; + + constructor(private alert) { 'ngInject'; - this.alert = alert; this.message = 'Hello World!'; } diff --git a/src/app/home/states/main/controller_spec.js b/src/app/home/states/main/controller_spec.ts similarity index 95% rename from src/app/home/states/main/controller_spec.js rename to src/app/home/states/main/controller_spec.ts index 60d1ac7..ce00150 100644 --- a/src/app/home/states/main/controller_spec.js +++ b/src/app/home/states/main/controller_spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import module from '../../module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe(`module: ${module}`, () => { diff --git a/src/app/home/states/main/state.js b/src/app/home/states/main/state.ts similarity index 71% rename from src/app/home/states/main/state.js rename to src/app/home/states/main/state.ts index fe65039..246035c 100644 --- a/src/app/home/states/main/state.js +++ b/src/app/home/states/main/state.ts @@ -1,5 +1,4 @@ import controller from './controller'; -import template from './template.html'; export default { name: 'home', @@ -7,6 +6,6 @@ export default { controller, controllerAs: 'ctrl', - template, + template: require('./template.html'), url: '/' }; diff --git a/src/app/home/states/main/state_spec.js b/src/app/home/states/main/state_spec.ts similarity index 100% rename from src/app/home/states/main/state_spec.js rename to src/app/home/states/main/state_spec.ts diff --git a/src/app/module.js b/src/app/module.ts similarity index 78% rename from src/app/module.js rename to src/app/module.ts index 277e938..0e7f716 100644 --- a/src/app/module.js +++ b/src/app/module.ts @@ -1,14 +1,15 @@ import { notFoundState, router } from './config'; -import angular from 'angular'; -import angularAnimate from 'angular-animate'; -import angularLoadingBar from 'angular-loading-bar'; +import * as angular from 'angular'; +import * as angularAnimate from 'angular-animate'; +import * as angularLoadingBar from 'angular-loading-bar'; import appAbout from './about/module'; import appCommons from './commons/module'; import appContacts from './contacts/module'; import appHome from './home/module'; -import buildSignature from '../../build_signature_loader!./build_signature.tpl'; import uiRouter from 'angular-ui-router'; +const buildSignature = require('../../build_signature_loader!./build_signature.tpl') + function stateErrorsHandler($log, $rootScope, $state) { 'ngInject'; diff --git a/src/app/module_spec.js b/src/app/module_spec.ts similarity index 92% rename from src/app/module_spec.js rename to src/app/module_spec.ts index 8e7004a..c23ef8e 100644 --- a/src/app/module_spec.js +++ b/src/app/module_spec.ts @@ -1,6 +1,7 @@ +import * as angular from 'angular'; import { expect } from 'chai'; import module from './module'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; describe(`module: ${module}`, () => { diff --git a/src/app/utils.js b/src/app/utils.ts similarity index 100% rename from src/app/utils.js rename to src/app/utils.ts diff --git a/src/app/utils_spec.js b/src/app/utils_spec.ts similarity index 98% rename from src/app/utils_spec.js rename to src/app/utils_spec.ts index db9da3c..03469e1 100644 --- a/src/app/utils_spec.js +++ b/src/app/utils_spec.ts @@ -5,6 +5,8 @@ describe('.extend', () => { class Dolphin { + name: string; + constructor(name) { this.name = name; } diff --git a/src/specs/toastr_mock_module.js b/src/specs/toastr_mock_module.ts similarity index 54% rename from src/specs/toastr_mock_module.js rename to src/specs/toastr_mock_module.ts index c1e77b2..1ae6cd8 100644 --- a/src/specs/toastr_mock_module.js +++ b/src/specs/toastr_mock_module.ts @@ -1,5 +1,6 @@ -import sinon from 'sinon'; -import toastr from 'angular-toastr'; +import * as angular from 'angular'; +import * as sinon from 'sinon'; +import * as toastr from 'angular-toastr'; export default angular.module('toastr.mock', [toastr]).decorator('toastr', ($delegate) => { return sinon.stub($delegate); diff --git a/src/typings/angular-loading-bar.d.ts b/src/typings/angular-loading-bar.d.ts new file mode 100644 index 0000000..49b4f16 --- /dev/null +++ b/src/typings/angular-loading-bar.d.ts @@ -0,0 +1,4 @@ +declare module 'angular-loading-bar' { + var _: string; + export = _; +} diff --git a/src/typings/angular-messages.d.ts b/src/typings/angular-messages.d.ts new file mode 100644 index 0000000..b576b20 --- /dev/null +++ b/src/typings/angular-messages.d.ts @@ -0,0 +1,4 @@ +declare module 'angular-messages' { + var _: string; + export = _; +} diff --git a/src/typings/angular-toastr.d.ts b/src/typings/angular-toastr.d.ts new file mode 100644 index 0000000..436429f --- /dev/null +++ b/src/typings/angular-toastr.d.ts @@ -0,0 +1,4 @@ +declare module 'angular-toastr' { + var _: string; + export = _; +} diff --git a/src/typings/require.d.ts b/src/typings/require.d.ts new file mode 100644 index 0000000..0ec43f7 --- /dev/null +++ b/src/typings/require.d.ts @@ -0,0 +1,5 @@ + declare var require: { + (path: string): T; + (paths: string[], callback: (...modules: any[]) => void): void; + ensure: (paths: string[], callback: (require: (path: string) => T) => void) => void; +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d8c5060 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "noImplicitAny": false + }, + "files": [ + "typings/index.d.ts", + "src/app.ts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/typings.json b/typings.json new file mode 100644 index 0000000..16cfea8 --- /dev/null +++ b/typings.json @@ -0,0 +1,15 @@ +{ + "dependencies": {}, + "globalDependencies": { + "angular": "registry:dt/angular#1.5.0+20160909133806", + "angular-animate": "registry:dt/angular-animate#1.5.0+20160709061515", + "angular-mocks": "registry:dt/angular-mocks#1.5.0+20160608104721", + "angular-resource": "registry:dt/angular-resource#1.5.0+20160914132003", + "chai": "registry:dt/chai#3.4.0+20160601211834", + "core-js": "registry:dt/core-js#0.0.0+20160914114559", + "jquery": "registry:dt/jquery#1.10.0+20160908203239", + "lodash": "registry:dt/lodash#4.14.0+20160830145422", + "mocha": "registry:dt/mocha#2.2.5+20160720003353", + "sinon": "registry:dt/sinon#1.16.0+20160517064723" + } +} diff --git a/webpack-test.config.js b/webpack-test.config.js index 6a4a8f1..36e7f55 100644 --- a/webpack-test.config.js +++ b/webpack-test.config.js @@ -1,60 +1,41 @@ -const combineLoaders = require('webpack-combine-loaders'); -const path = require('path'); const webpack = require('webpack'); -module.exports = function({ singleRun }) { - const preLoaders = []; +module.exports = { + resolve: { + extensions: ['', '.webpack.js', '.web.js', '.ts', '.js'], + alias: { sinon: 'sinon/pkg/sinon.js' } + }, - // Execute ESLint in tdd mode - if (!singleRun) { - preLoaders.push({ - test: /\.js$/, - loader: 'eslint', - exclude: /node_modules/ - }); - } - - return { - plugins: [ - new webpack.ProvidePlugin({ - 'window.$': 'jquery', - 'window.jQuery': 'jquery' - }) - ], - - module: { - preLoaders, + plugins: [ + new webpack.ProvidePlugin({ + 'window.$': 'jquery', + 'window.jQuery': 'jquery' + }) + ], - loaders: [{ - test: /\.js$/, - exclude: /node_modules/, - loader: combineLoaders([{ - loader: 'ng-annotate' - }, { - loader: 'babel', - query: { - extends: path.join(__dirname, '.babelrc.karma') - } - }]) - }, { - test: /\.html$/, - loader: 'html' - }, { - test: /sinon\.js$/, - loader: 'imports?define=>false,require=>false' - }, { - test: /\.scss/, - loader: 'null' - }, { - test: /\.jpg$/, - loader: 'null' - }] - }, - - resolve: { - alias: { sinon: 'sinon/pkg/sinon.js' } - }, + module: { + loaders: [{ + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel' + }, { + test: /\.ts$/, + exclude: /node_modules/, + loader: 'ng-annotate!ts' + }, { + test: /\.html$/, + loader: 'html' + }, { + test: /sinon\.js$/, + loader: 'imports?define=>false,require=>false' + }, { + test: /\.scss/, + loader: 'null' + }, { + test: /\.jpg$/, + loader: 'null' + }] + }, - devtool: 'inline-source-map' - }; + devtool: 'inline-source-map' }; diff --git a/webpack.config.js b/webpack.config.js index e7420a7..ad5c4b9 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,6 @@ const CleanWebpackPlugin = require('clean-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); -const combineLoaders = require('webpack-combine-loaders'); const path = require('path'); const webpack = require('webpack'); @@ -21,7 +20,7 @@ module.exports = { 'angular-toastr', 'angular-ui-router' ], - app: ['./src/app.js'] + app: ['./src/app.ts'] }, output: { @@ -30,6 +29,10 @@ module.exports = { chunkFilename: CHUNK_FILENAME }, + resolve: { + extensions: ['', '.webpack.js', '.web.js', '.ts', '.js'] + }, + plugins: [ new CleanWebpackPlugin(BUILD_DIRECTORY, { verbose: true @@ -52,16 +55,9 @@ module.exports = { module: { loaders: [{ - test: /\.js$/, + test: /\.ts$/, exclude: /node_modules/, - loader: combineLoaders([{ - loader: 'ng-annotate' - }, { - loader: 'babel', - query: { - extends: path.join(__dirname, '.babelrc') - } - }]) + loader: 'ng-annotate!ts-loader' }, { test: /\.html$/, loader: 'html' @@ -107,5 +103,5 @@ module.exports = { } }, - devtool: 'eval-source-map ' + devtool: 'eval-source-map' };