From 7c0dc0121efdf4af5c4a962d7ef830976392b84e Mon Sep 17 00:00:00 2001 From: ianm Date: Tue, 28 Mar 2017 21:57:15 -0400 Subject: [PATCH 01/17] electron symlink and webpack --- electron/karma.conf.js | 86 ++++++ electron/package.json | 95 ++++++ .../app/components/about/about.component.html | 21 ++ .../app/components/about/about.component.scss | 20 ++ .../components/about/about.component.spec.ts | 39 +++ .../components/about/about.component.tns.html | 27 ++ .../components/about/about.component.tns.scss | 15 + .../app/components/about/about.component.ts | 33 +++ .../src/app/components/about/about.routes.ts | 8 + .../src/app/components/app.component.html | 5 + .../src/app/components/app.component.spec.ts | 76 +++++ .../src/app/components/app.component.tns.html | 13 + electron/src/app/components/app.component.ts | 27 ++ electron/src/app/components/app.routes.ts | 8 + .../app/components/home/home.component.html | 23 ++ .../app/components/home/home.component.scss | 34 +++ .../components/home/home.component.spec.ts | 84 ++++++ .../components/home/home.component.tns.html | 24 ++ .../components/home/home.component.tns.scss | 6 + .../src/app/components/home/home.component.ts | 48 +++ .../src/app/components/home/home.routes.ts | 8 + electron/src/app/components/index.ts | 13 + electron/src/app/components/operators.ts | 11 + .../app/shared/analytics/analytics.module.ts | 31 ++ electron/src/app/shared/analytics/index.ts | 9 + .../services/analytics.service.spec.ts | 95 ++++++ .../analytics/services/analytics.service.ts | 95 ++++++ electron/src/app/shared/core/core.module.ts | 55 ++++ .../src/app/shared/core/directives/index.ts | 8 + .../directives/platform.directive.spec.ts | 44 +++ .../core/directives/platform.directive.ts | 22 ++ electron/src/app/shared/core/index.ts | 12 + .../app/shared/core/interfaces/iconsole.ts | 8 + .../src/app/shared/core/interfaces/ilang.ts | 5 + .../src/app/shared/core/interfaces/index.ts | 3 + .../src/app/shared/core/interfaces/iwindow.ts | 7 + .../app/shared/core/services/app.service.ts | 13 + .../shared/core/services/console.service.ts | 16 + .../src/app/shared/core/services/index.ts | 20 ++ .../shared/core/services/log.service.spec.ts | 125 ++++++++ .../app/shared/core/services/log.service.ts | 42 +++ .../services/router-extensions.service.ts | 41 +++ .../shared/core/services/window.service.ts | 15 + electron/src/app/shared/core/testing/index.ts | 9 + .../testing/mocks/mock-location-strategy.ts | 77 +++++ .../core/testing/mocks/ng2-config.mock.ts | 30 ++ .../testing/mocks/router-extensions.mock.ts | 21 ++ .../shared/core/testing/mocks/window.mock.ts | 27 ++ .../app/shared/core/testing/providers/core.ts | 25 ++ .../app/shared/core/testing/providers/http.ts | 39 +++ .../shared/core/testing/providers/router.ts | 12 + .../src/app/shared/core/utils/config.spec.ts | 38 +++ electron/src/app/shared/core/utils/config.ts | 78 +++++ electron/src/app/shared/core/utils/index.ts | 3 + electron/src/app/shared/core/utils/type.ts | 20 ++ .../app/shared/core/utils/view-broker.spec.ts | 28 ++ .../src/app/shared/core/utils/view-broker.ts | 27 ++ electron/src/app/shared/electron/index.ts | 5 + .../shared/electron/services/event.service.ts | 14 + .../electron/utils/desktop-config.spec.ts | 16 + .../shared/electron/utils/desktop-config.ts | 14 + electron/src/app/shared/i18n/actions/index.ts | 1 + .../i18n/actions/multilingual.action.ts | 62 ++++ .../app/shared/i18n/common/category.common.ts | 1 + electron/src/app/shared/i18n/common/index.ts | 1 + .../src/app/shared/i18n/components/index.ts | 1 + .../components/lang-switcher.component.html | 5 + .../components/lang-switcher.component.scss | 0 .../lang-switcher.component.spec.ts | 91 ++++++ .../lang-switcher.component.tns.html | 3 + .../lang-switcher.component.tns.ios.scss | 10 + .../lang-switcher.component.tns.scss | 10 + .../components/lang-switcher.component.ts | 50 ++++ electron/src/app/shared/i18n/effects/index.ts | 1 + .../i18n/effects/multilingual.effect.ts | 39 +++ electron/src/app/shared/i18n/index.ts | 17 ++ .../app/shared/i18n/multilingual.module.ts | 71 +++++ .../src/app/shared/i18n/reducers/index.ts | 1 + .../i18n/reducers/multilingual.reducer.ts | 20 ++ .../shared/i18n/services/i18n.providers.ts | 31 ++ .../src/app/shared/i18n/services/index.ts | 1 + .../services/multilingual.service.spec.ts | 92 ++++++ .../i18n/services/multilingual.service.ts | 52 ++++ electron/src/app/shared/i18n/states/index.ts | 1 + .../shared/i18n/states/multilingual.state.ts | 13 + electron/src/app/shared/i18n/testing/index.ts | 27 ++ .../mocks/ng2-config-multilang.mock.ts | 31 ++ .../mocks/ng2-translate-loader.mock.ts | 3 + .../i18n/testing/mocks/ng2-translate.mock.ts | 31 ++ electron/src/app/shared/ngrx/index.ts | 2 + .../src/app/shared/ngrx/state/app.state.ts | 85 ++++++ .../src/app/shared/sample/actions/index.ts | 1 + .../shared/sample/actions/name-list.action.ts | 73 +++++ .../shared/sample/common/category.common.ts | 1 + .../src/app/shared/sample/common/index.ts | 1 + .../src/app/shared/sample/components/index.ts | 10 + .../sample/components/navbar.component.css | 23 ++ .../sample/components/navbar.component.html | 5 + .../components/navbar.component.tns.css | 12 + .../components/navbar.component.tns.html | 4 + .../sample/components/navbar.component.ts | 13 + .../sample/components/toolbar.component.css | 40 +++ .../sample/components/toolbar.component.html | 3 + .../components/toolbar.component.tns.css | 6 + .../components/toolbar.component.tns.html | 9 + .../sample/components/toolbar.component.ts | 21 ++ .../src/app/shared/sample/effects/index.ts | 1 + .../shared/sample/effects/name-list.effect.ts | 45 +++ electron/src/app/shared/sample/index.ts | 17 ++ .../src/app/shared/sample/reducers/index.ts | 1 + .../sample/reducers/name-list.reducer.ts | 22 ++ .../src/app/shared/sample/sample.module.ts | 47 +++ .../shared/sample/services/app-config.spec.ts | 16 + .../app/shared/sample/services/app-config.ts | 14 + .../src/app/shared/sample/services/index.ts | 7 + .../sample/services/name-list.service.spec.ts | 81 +++++ .../sample/services/name-list.service.ts | 34 +++ .../src/app/shared/sample/states/index.ts | 1 + .../shared/sample/states/name-list.state.ts | 13 + electron/src/polyfills.ts | 0 electron/src/vendor.ts | 0 electron/tools/package.js | 58 ++++ electron/tools/webpack/helpers.js | 40 +++ electron/tsconfig.json | 35 +++ electron/webpack.config.js | 174 +++++++++++ electron/webpack.test.js | 277 ++++++++++++++++++ nativescript/package.json | 2 +- tools/install.js | 8 + 128 files changed, 3740 insertions(+), 1 deletion(-) create mode 100644 electron/karma.conf.js create mode 100644 electron/package.json create mode 100644 electron/src/app/components/about/about.component.html create mode 100644 electron/src/app/components/about/about.component.scss create mode 100644 electron/src/app/components/about/about.component.spec.ts create mode 100644 electron/src/app/components/about/about.component.tns.html create mode 100644 electron/src/app/components/about/about.component.tns.scss create mode 100644 electron/src/app/components/about/about.component.ts create mode 100644 electron/src/app/components/about/about.routes.ts create mode 100644 electron/src/app/components/app.component.html create mode 100644 electron/src/app/components/app.component.spec.ts create mode 100644 electron/src/app/components/app.component.tns.html create mode 100644 electron/src/app/components/app.component.ts create mode 100644 electron/src/app/components/app.routes.ts create mode 100644 electron/src/app/components/home/home.component.html create mode 100644 electron/src/app/components/home/home.component.scss create mode 100644 electron/src/app/components/home/home.component.spec.ts create mode 100644 electron/src/app/components/home/home.component.tns.html create mode 100644 electron/src/app/components/home/home.component.tns.scss create mode 100644 electron/src/app/components/home/home.component.ts create mode 100644 electron/src/app/components/home/home.routes.ts create mode 100644 electron/src/app/components/index.ts create mode 100644 electron/src/app/components/operators.ts create mode 100644 electron/src/app/shared/analytics/analytics.module.ts create mode 100644 electron/src/app/shared/analytics/index.ts create mode 100644 electron/src/app/shared/analytics/services/analytics.service.spec.ts create mode 100644 electron/src/app/shared/analytics/services/analytics.service.ts create mode 100644 electron/src/app/shared/core/core.module.ts create mode 100644 electron/src/app/shared/core/directives/index.ts create mode 100644 electron/src/app/shared/core/directives/platform.directive.spec.ts create mode 100644 electron/src/app/shared/core/directives/platform.directive.ts create mode 100644 electron/src/app/shared/core/index.ts create mode 100644 electron/src/app/shared/core/interfaces/iconsole.ts create mode 100644 electron/src/app/shared/core/interfaces/ilang.ts create mode 100644 electron/src/app/shared/core/interfaces/index.ts create mode 100644 electron/src/app/shared/core/interfaces/iwindow.ts create mode 100644 electron/src/app/shared/core/services/app.service.ts create mode 100644 electron/src/app/shared/core/services/console.service.ts create mode 100644 electron/src/app/shared/core/services/index.ts create mode 100644 electron/src/app/shared/core/services/log.service.spec.ts create mode 100644 electron/src/app/shared/core/services/log.service.ts create mode 100644 electron/src/app/shared/core/services/router-extensions.service.ts create mode 100644 electron/src/app/shared/core/services/window.service.ts create mode 100644 electron/src/app/shared/core/testing/index.ts create mode 100644 electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts create mode 100644 electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts create mode 100644 electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts create mode 100644 electron/src/app/shared/core/testing/mocks/window.mock.ts create mode 100644 electron/src/app/shared/core/testing/providers/core.ts create mode 100644 electron/src/app/shared/core/testing/providers/http.ts create mode 100644 electron/src/app/shared/core/testing/providers/router.ts create mode 100644 electron/src/app/shared/core/utils/config.spec.ts create mode 100644 electron/src/app/shared/core/utils/config.ts create mode 100644 electron/src/app/shared/core/utils/index.ts create mode 100644 electron/src/app/shared/core/utils/type.ts create mode 100644 electron/src/app/shared/core/utils/view-broker.spec.ts create mode 100644 electron/src/app/shared/core/utils/view-broker.ts create mode 100644 electron/src/app/shared/electron/index.ts create mode 100644 electron/src/app/shared/electron/services/event.service.ts create mode 100644 electron/src/app/shared/electron/utils/desktop-config.spec.ts create mode 100644 electron/src/app/shared/electron/utils/desktop-config.ts create mode 100644 electron/src/app/shared/i18n/actions/index.ts create mode 100644 electron/src/app/shared/i18n/actions/multilingual.action.ts create mode 100644 electron/src/app/shared/i18n/common/category.common.ts create mode 100644 electron/src/app/shared/i18n/common/index.ts create mode 100644 electron/src/app/shared/i18n/components/index.ts create mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.html create mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.scss create mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts create mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.tns.html create mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss create mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss create mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.ts create mode 100644 electron/src/app/shared/i18n/effects/index.ts create mode 100644 electron/src/app/shared/i18n/effects/multilingual.effect.ts create mode 100644 electron/src/app/shared/i18n/index.ts create mode 100644 electron/src/app/shared/i18n/multilingual.module.ts create mode 100644 electron/src/app/shared/i18n/reducers/index.ts create mode 100644 electron/src/app/shared/i18n/reducers/multilingual.reducer.ts create mode 100644 electron/src/app/shared/i18n/services/i18n.providers.ts create mode 100644 electron/src/app/shared/i18n/services/index.ts create mode 100644 electron/src/app/shared/i18n/services/multilingual.service.spec.ts create mode 100644 electron/src/app/shared/i18n/services/multilingual.service.ts create mode 100644 electron/src/app/shared/i18n/states/index.ts create mode 100644 electron/src/app/shared/i18n/states/multilingual.state.ts create mode 100644 electron/src/app/shared/i18n/testing/index.ts create mode 100644 electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts create mode 100644 electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts create mode 100644 electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts create mode 100644 electron/src/app/shared/ngrx/index.ts create mode 100644 electron/src/app/shared/ngrx/state/app.state.ts create mode 100644 electron/src/app/shared/sample/actions/index.ts create mode 100644 electron/src/app/shared/sample/actions/name-list.action.ts create mode 100644 electron/src/app/shared/sample/common/category.common.ts create mode 100644 electron/src/app/shared/sample/common/index.ts create mode 100644 electron/src/app/shared/sample/components/index.ts create mode 100644 electron/src/app/shared/sample/components/navbar.component.css create mode 100644 electron/src/app/shared/sample/components/navbar.component.html create mode 100644 electron/src/app/shared/sample/components/navbar.component.tns.css create mode 100644 electron/src/app/shared/sample/components/navbar.component.tns.html create mode 100644 electron/src/app/shared/sample/components/navbar.component.ts create mode 100644 electron/src/app/shared/sample/components/toolbar.component.css create mode 100644 electron/src/app/shared/sample/components/toolbar.component.html create mode 100644 electron/src/app/shared/sample/components/toolbar.component.tns.css create mode 100644 electron/src/app/shared/sample/components/toolbar.component.tns.html create mode 100644 electron/src/app/shared/sample/components/toolbar.component.ts create mode 100644 electron/src/app/shared/sample/effects/index.ts create mode 100644 electron/src/app/shared/sample/effects/name-list.effect.ts create mode 100644 electron/src/app/shared/sample/index.ts create mode 100644 electron/src/app/shared/sample/reducers/index.ts create mode 100644 electron/src/app/shared/sample/reducers/name-list.reducer.ts create mode 100644 electron/src/app/shared/sample/sample.module.ts create mode 100644 electron/src/app/shared/sample/services/app-config.spec.ts create mode 100644 electron/src/app/shared/sample/services/app-config.ts create mode 100644 electron/src/app/shared/sample/services/index.ts create mode 100644 electron/src/app/shared/sample/services/name-list.service.spec.ts create mode 100644 electron/src/app/shared/sample/services/name-list.service.ts create mode 100644 electron/src/app/shared/sample/states/index.ts create mode 100644 electron/src/app/shared/sample/states/name-list.state.ts create mode 100644 electron/src/polyfills.ts create mode 100644 electron/src/vendor.ts create mode 100644 electron/tools/package.js create mode 100644 electron/tools/webpack/helpers.js create mode 100644 electron/tsconfig.json create mode 100644 electron/webpack.config.js create mode 100644 electron/webpack.test.js diff --git a/electron/karma.conf.js b/electron/karma.conf.js new file mode 100644 index 000000000..7b353b6a8 --- /dev/null +++ b/electron/karma.conf.js @@ -0,0 +1,86 @@ +module.exports = function(config) { + var testWebpackConfig = require('./webpack.test.js'); + + config.set({ + + // base path that will be used to resolve all patterns (e.g. files, exclude) + basePath: '', + + /* + * Frameworks to use. We will use jasmine, default for angular2 testing + * + * available frameworks: https://npmjs.org/browse/keyword/karma-adapter + */ + frameworks: ['jasmine'], + + // list of files to exclude + exclude: [ ], + + /* + * list of files / patterns to load in the browser + * + * we are building the test environment in ./spec-bundle.js + */ + files: [ { pattern: './config/spec-bundle.js', watched: false } ], + + /* + * preprocess matching files before serving them to the browser + * available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + */ + preprocessors: { './config/spec-bundle.js': ['coverage', 'webpack', 'sourcemap'] }, + + // Webpack Config at ./webpack.test.js + webpack: testWebpackConfig, + + coverageReporter: { + dir : 'coverage/', + reporters: [ + { type: 'text-summary' }, + { type: 'json' }, + { type: 'html' } + ] + }, + + // Webpack please don't spam the console when running in karma! + webpackServer: { noInfo: true }, + + /* + * test results reporter to use + * + * possible values: 'dots', 'progress' + * available reporters: https://npmjs.org/browse/keyword/karma-reporter + */ + reporters: [ 'mocha', 'coverage' ], + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + /* + * level of logging + * possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + */ + logLevel: config.LOG_INFO, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + /* + * start these browsers + * available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + */ + browsers: [ + // 'Chrome', + 'PhantomJS' + ], + + /* + * Continuous Integration mode + * if true, Karma captures browsers, runs the tests and exits + */ + singleRun: true + }); + +}; \ No newline at end of file diff --git a/electron/package.json b/electron/package.json new file mode 100644 index 000000000..a4d1eb897 --- /dev/null +++ b/electron/package.json @@ -0,0 +1,95 @@ +{ + "name": "angular2-electron", + "version": "0.0.0", + "description": "Angular 2 with Electron and Webpack", + "main": "main.desktop.js", + "scripts": { + "watch": "npm run watch:dev", + "watch:dev": "webpack --watch --progress --profile", + "build": "npm run build:dev", + "build:dev": "webpack --progress --profile", + "package": "node package.js", + "package-all": "npm run package -- --all", + "electron": "electron src/app", + "webpack-test": "webpack --config webpack.test.js --progress --profile", + "test": "karma start" + }, + "dependencies": { + "@angular/common": "^2.4.2", + "@angular/compiler": "^2.4.2", + "@angular/core": "^2.4.2", + "@angular/forms": "^2.4.2", + "@angular/http": "^2.4.2", + "@angular/platform-browser": "^2.4.2", + "@angular/platform-browser-dynamic": "^2.4.2", + "@angular/platform-server": "^2.4.2", + "@angular/router": "^3.4.2", + "@ngrx/core": "^1.2.0", + "@ngrx/store": "^2.2.1", + "copy-webpack-plugin": "^4.0.1", + "core-js": "^2.4.1", + "electron": "^1.6.2", + "electron-settings": "^2.2.2", + "es6-promise": "^4.1.0", + "rxjs": "^5.0.0-rc.1", + "webpack-target-electron-renderer": "^0.4.0", + "zone.js": "^0.7.2" + }, + "devDependencies": { + "@types/electron": "^1.4.33", + "@types/hammerjs": "^2.0.33", + "@types/jasmine": "^2.2.34", + "@types/moment-timezone": "^0.2.32", + "@types/mongodb": "^2.1.41", + "@types/node": "^7.0.1", + "@types/source-map": "^0.5.0", + "@types/uglify-js": "^2.0.27", + "@types/webpack": "^2.0.0", + "angular2-template-loader": "^0.6.0", + "awesome-typescript-loader": "^3.0.8", + "codelyzer": "^2.0.0-beta.2", + "css-loader": "^0.26.0", + "electron-packager": "^8.1.0", + "electron-rebuild": "^1.5.7", + "electron-reload": "^1.1.0", + "es6-promise-loader": "^1.0.1", + "extract-text-webpack-plugin": "^2.0.0", + "file-loader": "^0.10.0", + "imports-loader": "^0.7.0", + "istanbul-instrumenter-loader": "^2.0.0", + "jasmine-core": "^2.4.1", + "json-loader": "^0.5.4", + "karma": "^1.3.0", + "karma-chrome-launcher": "^2.0.0", + "karma-coverage": "^1.0.0", + "karma-jasmine": "^1.0.2", + "karma-mocha-reporter": "^2.0.0", + "karma-phantomjs-launcher": "^1.0.0", + "karma-sourcemap-loader": "^0.3.7", + "karma-webpack": "2.0.2", + "node-sass": "^4.0.0", + "phantomjs-polyfill": "0.0.2", + "phantomjs-prebuilt": "^2.1.7", + "raw-loader": "0.5.1", + "reflect-metadata": "0.1.10", + "remap-istanbul": "^0.9.0", + "rimraf": "^2.5.2", + "sass-loader": "^6.0.1", + "source-map-loader": "^0.1.5", + "style-loader": "^0.13.1", + "svg-url-loader": "^2.0.0", + "ts-helpers": "^1.1.1", + "tsconfig-lint": "^0.12.0", + "tslint": "^4.0.2", + "tslint-loader": "^3.2.0", + "typescript": "~2.1.5", + "url-loader": "^0.5.7", + "webpack": "^2.2.1", + "webpack-dev-middleware": "^1.10.1", + "webpack-dev-server": "^2.4.1" + }, + "engines": { + "node": ">= 4.2.1 <= 6", + "npm": ">= 3" + } +} diff --git a/electron/src/app/components/about/about.component.html b/electron/src/app/components/about/about.component.html new file mode 100644 index 000000000..071ed6414 --- /dev/null +++ b/electron/src/app/components/about/about.component.html @@ -0,0 +1,21 @@ +
+

+ Angular Seed Advanced is a starter project that implements best practices in coding, building and testing Angular 2 apps. + Additionally it adds various enhancements and integrations for large global projects. +

+ +

Features

+ +
diff --git a/electron/src/app/components/about/about.component.scss b/electron/src/app/components/about/about.component.scss new file mode 100644 index 000000000..47835c1b8 --- /dev/null +++ b/electron/src/app/components/about/about.component.scss @@ -0,0 +1,20 @@ +:host { + display: block; + padding: 0 16px; +} + +.feature-list .body { + font-size: 16; + color: #555; + margin: 0 0 5 0; +} + +.h1 { + color: #106cc8; + font-size: 24; +} + +.h4 { + color: #999; + font-size: 18; +} diff --git a/electron/src/app/components/about/about.component.spec.ts b/electron/src/app/components/about/about.component.spec.ts new file mode 100644 index 000000000..68555311d --- /dev/null +++ b/electron/src/app/components/about/about.component.spec.ts @@ -0,0 +1,39 @@ +// angular +import { Component } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; + +// app +import { t } from '../../shared/test/index'; +import { AboutComponent } from './about.component'; + +// test module configuration for each test +const testModuleConfig = () => { + TestBed.configureTestingModule({ + declarations: [AboutComponent, TestComponent] + }); +}; + +export function main() { + t.describe('@Component: AboutComponent', () => { + + t.be(testModuleConfig); + + t.it('should work', + t.async(() => { + TestBed.compileComponents() + .then(() => { + let fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + let aboutDOMEl = fixture.debugElement.children[0].nativeElement; + + t.e(aboutDOMEl.querySelectorAll('h2')[0].textContent).toEqual('Features'); + }); + })); + }); +} + +@Component({ + selector: 'test-cmp', + template: '' +}) +class TestComponent { } diff --git a/electron/src/app/components/about/about.component.tns.html b/electron/src/app/components/about/about.component.tns.html new file mode 100644 index 000000000..b0aa979f9 --- /dev/null +++ b/electron/src/app/components/about/about.component.tns.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/electron/src/app/components/about/about.component.tns.scss b/electron/src/app/components/about/about.component.tns.scss new file mode 100644 index 000000000..43f0a5a47 --- /dev/null +++ b/electron/src/app/components/about/about.component.tns.scss @@ -0,0 +1,15 @@ +.feature-list .body { + font-size: 16; + color: #555; + margin: 0 0 5 0; +} + +.h1 { + color: #106cc8; + font-size: 24; +} + +.h4 { + color: #999; + font-size: 18; +} diff --git a/electron/src/app/components/about/about.component.ts b/electron/src/app/components/about/about.component.ts new file mode 100644 index 000000000..a0991104c --- /dev/null +++ b/electron/src/app/components/about/about.component.ts @@ -0,0 +1,33 @@ +import { Injector, Component } from '@angular/core'; +import { Config } from '../../shared/core/index'; + +@Component({ + moduleId: module.id, + selector: 'sd-about', + templateUrl: 'about.component.html', + styleUrls: [ + 'about.component.css', + ], +}) +export class AboutComponent { + + // Just one way you could handle the {N} `ui/page` Page class + // in a shared component... + private _page: any; + private get page() { + if (Config.PageClass) { + if (!this._page) { + this._page = this.injector.get(Config.PageClass); + } + + return this._page; + } + } + + constructor(private injector: Injector) { + // This is here as an example + // if (this.page) { + // this.page.actionBarHidden = true; + // } + } +} diff --git a/electron/src/app/components/about/about.routes.ts b/electron/src/app/components/about/about.routes.ts new file mode 100644 index 000000000..e63de16de --- /dev/null +++ b/electron/src/app/components/about/about.routes.ts @@ -0,0 +1,8 @@ +import { AboutComponent } from './about.component'; + +export const AboutRoutes: Array = [ + { + path: 'about', + component: AboutComponent + } +]; diff --git a/electron/src/app/components/app.component.html b/electron/src/app/components/app.component.html new file mode 100644 index 000000000..95a011d12 --- /dev/null +++ b/electron/src/app/components/app.component.html @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/electron/src/app/components/app.component.spec.ts b/electron/src/app/components/app.component.spec.ts new file mode 100644 index 000000000..e2fd45c60 --- /dev/null +++ b/electron/src/app/components/app.component.spec.ts @@ -0,0 +1,76 @@ +// angular +import { TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Route } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; + +// libs +import { StoreModule } from '@ngrx/store'; +import { Angulartics2Module } from 'angulartics2'; +import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; + +// app +import { t } from '../shared/test/index'; +import { TEST_CORE_PROVIDERS, TEST_HTTP_PROVIDERS } from '../shared/core/testing/index'; +import { NameListService, NavbarComponent, ToolbarComponent } from '../shared/sample/index'; +import { MultilingualModule } from '../shared/i18n/multilingual.module'; +import { reducer } from '../shared/i18n/index'; + +// module +import { AppComponent } from './app.component'; +import { HomeComponent } from './home/home.component'; +import { AboutComponent } from './about/about.component'; + +const config:Route[] = [ + {path: '', component: HomeComponent}, + {path: 'about', component: AboutComponent} +]; + +// test module configuration for each test +const testModuleConfig = () => { + TestBed.configureTestingModule({ + imports: [ + FormsModule, + Angulartics2Module.forRoot([ + Angulartics2Segment + ]), + MultilingualModule, + StoreModule.provideStore({ }), + RouterTestingModule.withRoutes(config) + ], + declarations: [ + TestComponent, AppComponent, + HomeComponent, AboutComponent, + NavbarComponent, ToolbarComponent + ], + providers: [ + TEST_CORE_PROVIDERS(), + TEST_HTTP_PROVIDERS(), + NameListService + ] + }); +}; + +export function main() { + t.describe('@Component: AppComponent', () => { + + t.be(testModuleConfig); + + t.it('should build without a problem', + t.async(() => { + TestBed.compileComponents() + .then(() => { + let fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + t.e(fixture.nativeElement).toBeTruthy(); + }); + })); + }); +} + +@Component({ + selector: 'test-cmp', + template: '' +}) +class TestComponent {} diff --git a/electron/src/app/components/app.component.tns.html b/electron/src/app/components/app.component.tns.html new file mode 100644 index 000000000..21e585e7d --- /dev/null +++ b/electron/src/app/components/app.component.tns.html @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/electron/src/app/components/app.component.ts b/electron/src/app/components/app.component.ts new file mode 100644 index 000000000..302051c69 --- /dev/null +++ b/electron/src/app/components/app.component.ts @@ -0,0 +1,27 @@ +// any operators needed throughout your application +import './operators'; + +// libs +import { Component, OnInit } from '@angular/core'; + +// app +import { AnalyticsService } from '../shared/analytics/index'; +import { Config, LogService, AppService } from '../shared/core/index'; + +/** + * This class represents the main application component. + */ +@Component({ + moduleId: module.id, + selector: 'sd-app', + templateUrl: 'app.component.html' +}) +export class AppComponent { + constructor( + public analytics: AnalyticsService, + public log: LogService, + private appService: AppService + ) { + log.debug(`Config env: ${Config.ENVIRONMENT().ENV}`); + } +} diff --git a/electron/src/app/components/app.routes.ts b/electron/src/app/components/app.routes.ts new file mode 100644 index 000000000..0aad2d95c --- /dev/null +++ b/electron/src/app/components/app.routes.ts @@ -0,0 +1,8 @@ +// app +import { HomeRoutes } from './home/home.routes'; +import { AboutRoutes } from './about/about.routes'; + +export const routes: Array = [ + ...HomeRoutes, + ...AboutRoutes +]; diff --git a/electron/src/app/components/home/home.component.html b/electron/src/app/components/home/home.component.html new file mode 100644 index 000000000..1bf66de6d --- /dev/null +++ b/electron/src/app/components/home/home.component.html @@ -0,0 +1,23 @@ +

+ {{ 'LOVE_TECH' | translate }}
+

+ +

+ {{'ABOUT_REWARD' | translate}} +

+

+ {{'ABOUT_ADD' | translate}} +

+ +
+ + +
+ +
    +
  • {{name}}
  • +
+ +

+ About - RouterExtensions example +

diff --git a/electron/src/app/components/home/home.component.scss b/electron/src/app/components/home/home.component.scss new file mode 100644 index 000000000..d8addab91 --- /dev/null +++ b/electron/src/app/components/home/home.component.scss @@ -0,0 +1,34 @@ +:host { + display: block; + padding: 0 16px; +} + +input { + width: 250px; +} + +ul { + list-style-type: none; + padding: 0 0 0 8px; +} + +.smile { + background: url("./assets/svg/smile.svg"); + height: 48px; + width: 48px; + display: inline-block; + transform: scale(0.6); + margin-top: -25px; + position: relative; + top: 16px; +} + +a.link { + color: #00e; + cursor: pointer; + text-decoration: underline; +} + +a.link:hover { + color: #f00; +} diff --git a/electron/src/app/components/home/home.component.spec.ts b/electron/src/app/components/home/home.component.spec.ts new file mode 100644 index 000000000..0eb478d49 --- /dev/null +++ b/electron/src/app/components/home/home.component.spec.ts @@ -0,0 +1,84 @@ +// angular +import { Component } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { + BaseRequestOptions, + ConnectionBackend, + Http +} from '@angular/http'; +import { MockBackend } from '@angular/http/testing'; + +// libs +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; + +import { t } from '../../shared/test/index'; +import { NameListService, NameListEffects, reducer } from '../../shared/sample/index'; +import { CoreModule } from '../../shared/core/core.module'; +import { AnalyticsModule } from '../../shared/analytics/analytics.module'; +import { MultilingualModule } from '../../shared/i18n/multilingual.module'; +import { HomeComponent } from './home.component'; + +// test module configuration for each test +const testModuleConfig = () => { + TestBed.configureTestingModule({ + imports: [ + CoreModule, + RouterTestingModule, + AnalyticsModule, + MultilingualModule, + StoreModule.provideStore({ sample: reducer }), + EffectsModule.run(NameListEffects) + ], + declarations: [HomeComponent, TestComponent], + providers: [ + NameListService, + BaseRequestOptions, + MockBackend, + { + provide: Http, useFactory: function (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) { + return new Http(backend, defaultOptions); + }, + deps: [MockBackend, BaseRequestOptions] + } + ] + }); +}; + +export function main() { + t.describe('@Component: HomeComponent', () => { + + t.be(testModuleConfig); + + t.it('should work', + t.async(() => { + TestBed.compileComponents() + .then(() => { + let fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + + let homeInstance = fixture.debugElement.children[0].componentInstance; + let homeDOMEl = fixture.debugElement.children[0].nativeElement; + + t.e(homeDOMEl.querySelectorAll('li').length).toEqual(0); + + homeInstance.newName = 'Minko'; + homeInstance.addName(); + + fixture.detectChanges(); + + t.e(homeDOMEl.querySelectorAll('li').length).toEqual(1); + t.e(homeDOMEl.querySelectorAll('li')[0].textContent).toEqual('Minko'); + }); + })); + }); +} + +@Component({ + selector: 'test-cmp', + template: '' +}) +class TestComponent { + +} diff --git a/electron/src/app/components/home/home.component.tns.html b/electron/src/app/components/home/home.component.tns.html new file mode 100644 index 000000000..33419b063 --- /dev/null +++ b/electron/src/app/components/home/home.component.tns.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/electron/src/app/components/home/home.component.tns.scss b/electron/src/app/components/home/home.component.tns.scss new file mode 100644 index 000000000..2fcaaa107 --- /dev/null +++ b/electron/src/app/components/home/home.component.tns.scss @@ -0,0 +1,6 @@ +.love-tech { + font-size: 28; + font-weight: bold; + color: purple; + margin: 8 0 8 0; +} diff --git a/electron/src/app/components/home/home.component.ts b/electron/src/app/components/home/home.component.ts new file mode 100644 index 000000000..04c8d5878 --- /dev/null +++ b/electron/src/app/components/home/home.component.ts @@ -0,0 +1,48 @@ +// libs +import { Component, ElementRef, ViewChild, OnInit } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs/Observable'; + +// app +import { RouterExtensions, Config } from '../../shared/core/index'; +import { IAppState, getNames } from '../../shared/ngrx/index'; +import * as nameList from '../../shared/sample/index'; + +@Component({ + moduleId: module.id, + selector: 'sd-home', + templateUrl: 'home.component.html', + styleUrls: ['home.component.css'] +}) +export class HomeComponent implements OnInit { + public names$: Observable; + public newName: string; + + constructor(private store: Store, public routerext: RouterExtensions) {} + + ngOnInit() { + this.names$ = this.store.let(getNames); + this.newName = ''; + } + + /* + * @param newname any text as input. + * @returns return false to prevent default form submit behavior to refresh the page. + */ + addName(): boolean { + this.store.dispatch(new nameList.AddAction(this.newName)); + this.newName = ''; + return false; + } + + readAbout() { + // Try this in the {N} app + // {N} can use these animation options + this.routerext.navigate(['/about'], { + transition: { + duration: 1000, + name: 'slideTop', + } + }); + } +} diff --git a/electron/src/app/components/home/home.routes.ts b/electron/src/app/components/home/home.routes.ts new file mode 100644 index 000000000..08c0ea203 --- /dev/null +++ b/electron/src/app/components/home/home.routes.ts @@ -0,0 +1,8 @@ +import { HomeComponent } from './home.component'; + +export const HomeRoutes: Array = [ + { + path: '', + component: HomeComponent + } +]; diff --git a/electron/src/app/components/index.ts b/electron/src/app/components/index.ts new file mode 100644 index 000000000..6d2866641 --- /dev/null +++ b/electron/src/app/components/index.ts @@ -0,0 +1,13 @@ +import { AppComponent } from './app.component'; +import { AboutComponent } from './about/about.component'; +import { HomeComponent } from './home/home.component'; + +export const APP_COMPONENTS: any[] = [ + AppComponent, + AboutComponent, + HomeComponent +]; + +export * from './app.component'; +export * from './about/about.component'; +export * from './home/home.component'; diff --git a/electron/src/app/components/operators.ts b/electron/src/app/components/operators.ts new file mode 100644 index 000000000..16bc34aaa --- /dev/null +++ b/electron/src/app/components/operators.ts @@ -0,0 +1,11 @@ +// rxjs +import 'rxjs/add/observable/throw'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/operator/switchMap'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/take'; +import 'rxjs/add/operator/let'; + +// ngrx +import '@ngrx/core/add/operator/select'; diff --git a/electron/src/app/shared/analytics/analytics.module.ts b/electron/src/app/shared/analytics/analytics.module.ts new file mode 100644 index 000000000..1bc0d9325 --- /dev/null +++ b/electron/src/app/shared/analytics/analytics.module.ts @@ -0,0 +1,31 @@ +// angular +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { HttpModule } from '@angular/http'; + +// lib +import { Angulartics2Module } from 'angulartics2'; +import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; + +// module +import { ANALYTICS_PROVIDERS } from './index'; + +/** + * Do not specify providers for modules that might be imported by a lazy loaded module. + */ + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + HttpModule, + Angulartics2Module.forRoot([ + Angulartics2Segment + ]) + ], + providers: ANALYTICS_PROVIDERS +}) +export class AnalyticsModule { + +} diff --git a/electron/src/app/shared/analytics/index.ts b/electron/src/app/shared/analytics/index.ts new file mode 100644 index 000000000..670d1bdf5 --- /dev/null +++ b/electron/src/app/shared/analytics/index.ts @@ -0,0 +1,9 @@ +// app +import { AnalyticsService } from './services/analytics.service'; + +export const ANALYTICS_PROVIDERS: Array = [ + AnalyticsService +]; + +// services +export * from './services/analytics.service'; diff --git a/electron/src/app/shared/analytics/services/analytics.service.spec.ts b/electron/src/app/shared/analytics/services/analytics.service.spec.ts new file mode 100644 index 000000000..cc2dc47d1 --- /dev/null +++ b/electron/src/app/shared/analytics/services/analytics.service.spec.ts @@ -0,0 +1,95 @@ +// angular +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +// libs +import { Angulartics2Module } from 'angulartics2'; +import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; + +// app +import { t } from '../../test/index'; + +// module +import { AnalyticsService, Analytics } from '../index'; + +const testModuleConfig = () => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + Angulartics2Module.forRoot([ + Angulartics2Segment + ]) + ], + providers: [ + AnalyticsService + ] + }); +}; + +export function main() { + t.describe('analytics:', () => { + + t.be(testModuleConfig); + + t.describe('AnalyticsService', () => { + + t.describe('api works', () => { + t.it('track', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { + analyticsService.devMode(false); + t.spyOn(segment, 'eventTrack'); + analyticsService.track('click', { category: 'TEST', label: 'Testing' }); + t.e(segment.eventTrack).toHaveBeenCalledWith('click', { category: 'TEST', label: 'Testing' }); + })); + t.it('track devMode: ON', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { + t.spyOn(segment, 'eventTrack'); + + // dev mode: shouldn't track anything + analyticsService.devMode(true); + analyticsService.track('click', { category: 'TEST', label: 'Testing' }); + t.e(segment.eventTrack).not.toHaveBeenCalled(); + })); + t.it('pageTrack', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { + t.spyOn(segment, 'pageTrack'); + analyticsService.pageTrack('/testing', { }); + t.e(segment.pageTrack).toHaveBeenCalledWith('/testing', {}); + })); + t.it('pageTrack devMode: ON', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { + t.spyOn(segment, 'pageTrack'); + + // dev mode: shouldn't track anything + analyticsService.devMode(true); + analyticsService.pageTrack('/testing', { }); + t.e(segment.pageTrack).not.toHaveBeenCalled(); + })); + t.it('identify', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { + t.spyOn(segment, 'setUserProperties'); + analyticsService.identify({ userId: 1, name: 'Test', email: 'name@domain.com' }); + t.e(segment.setUserProperties).toHaveBeenCalledWith({ userId: 1, name: 'Test', email: 'name@domain.com' }); + })); + t.it('identify devMode: ON', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { + t.spyOn(segment, 'setUserProperties'); + + // dev mode: shouldn't track anything + analyticsService.devMode(true); + analyticsService.identify({ userId: 1, name: 'Test', email: 'name@domain.com' }); + t.e(segment.setUserProperties).not.toHaveBeenCalled(); + })); + }); + }); + + t.describe('Analytics (Base Class)', () => { + + t.describe('should allow descendants to track actions', () => { + t.it('track', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { + t.spyOn(analyticsService, 'track'); + let analytics = new TestAnalytics(analyticsService); + analytics.category = 'TEST'; + analytics.track('action', { category: analytics.category, label: 'Testing' }); + t.e(analyticsService.track).toHaveBeenCalledWith('action', { category: analytics.category, label: 'Testing' }); + })); + }); + }); + }); +} + +class TestAnalytics extends Analytics { } diff --git a/electron/src/app/shared/analytics/services/analytics.service.ts b/electron/src/app/shared/analytics/services/analytics.service.ts new file mode 100644 index 000000000..6cf84dedf --- /dev/null +++ b/electron/src/app/shared/analytics/services/analytics.service.ts @@ -0,0 +1,95 @@ +// angular +import { Injectable, Inject } from '@angular/core'; + +// libs +import * as _ from 'lodash'; +import { Angulartics2 } from 'angulartics2'; +import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; + +export interface IAnalyticsProperties { + category?: string; + label?: string; + value?: number; +} + +export interface IAnalytics { + track(action: string, properties: IAnalyticsProperties): void; +} + +/** + * Wrapper for Angulartics2 + */ +@Injectable() +export class AnalyticsService implements IAnalytics { + + constructor(private angulartics2: Angulartics2, private segment: Angulartics2Segment) { + // options + // https://github.com/angulartics/angulartics2/blob/master/src/core/angulartics2.ts#L90-L104 + // angulartics2.virtualPageviews(value: boolean); + // angulartics2.excludeRoutes(routes: Array); + // angulartics2.firstPageview(value: boolean); + // angulartics2.withBase(value: string); + + this.devMode(false); + } + + /** + * Track actions, events, etc. + **/ + public track(action: string, properties: IAnalyticsProperties): void { + if (!this.devMode()) { + this.segment.eventTrack(action, properties); + } + } + + /** + * Called automatically by default with Angular 2 Routing + * However, that can be turned off and this could be used manually + **/ + public pageTrack(path: string, location: any) { + if (!this.devMode()) { + this.segment.pageTrack(path, location); + } + } + + /** + * Identify authenticated users + **/ + public identify(properties: any) { + if (!this.devMode()) { + this.segment.setUserProperties(properties); + } + } + + /** + * Control whether analytics are tracked + * true: dev mode on, therefore do not track anything + * false: dev mode off, track everything + **/ + public devMode(enable?: boolean): boolean { + if (typeof enable !== 'undefined') { + this.angulartics2.developerMode(enable); + } + return this.angulartics2.settings.developerMode; + } +} + +/** + * Base class + * Standardizes tracking actions and categorization + */ +export class Analytics implements IAnalytics { + // sub-classes should define their category + public category: string; + + constructor(@Inject(AnalyticsService) public analytics: AnalyticsService) { + + } + + /** + * Track actions, events, etc. + **/ + track(action: string, properties: IAnalyticsProperties): void { + this.analytics.track(action, _.extend(properties, { category: this.category })); + } +} diff --git a/electron/src/app/shared/core/core.module.ts b/electron/src/app/shared/core/core.module.ts new file mode 100644 index 000000000..fee0e14f7 --- /dev/null +++ b/electron/src/app/shared/core/core.module.ts @@ -0,0 +1,55 @@ +// angular +import { NgModule, ModuleWithProviders, Optional, SkipSelf } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { HttpModule } from '@angular/http'; + +// module +import { CORE_DIRECTIVES } from './directives/index'; +import { CORE_PROVIDERS } from './services/index'; +import { Config } from './utils/index'; + +interface ICoreModuleOptions { + window?: any; + console?: any; +} + +/** + * Do not specify providers for modules that might be imported by a lazy loaded module. + */ + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + HttpModule + ], + declarations: [ + CORE_DIRECTIVES + ], + exports: [ + CommonModule, + FormsModule, + RouterModule, + HttpModule, + CORE_DIRECTIVES + ], + providers: [ + CORE_PROVIDERS + ] +}) +export class CoreModule { + // configuredProviders: *required to configure WindowService and ConsoleService per platform + static forRoot(configuredProviders: Array): ModuleWithProviders { + return { + ngModule: CoreModule, + providers: configuredProviders + }; + } + constructor(@Optional() @SkipSelf() parentModule: CoreModule) { + if (parentModule) { + throw new Error('CoreModule already loaded; Import in root module only.'); + } + } +} diff --git a/electron/src/app/shared/core/directives/index.ts b/electron/src/app/shared/core/directives/index.ts new file mode 100644 index 000000000..b233a64eb --- /dev/null +++ b/electron/src/app/shared/core/directives/index.ts @@ -0,0 +1,8 @@ +// app +import { PlatformDirective } from './platform.directive'; + +export const CORE_DIRECTIVES: any[] = [ + PlatformDirective +]; + +export * from './platform.directive'; diff --git a/electron/src/app/shared/core/directives/platform.directive.spec.ts b/electron/src/app/shared/core/directives/platform.directive.spec.ts new file mode 100644 index 000000000..60e68ac55 --- /dev/null +++ b/electron/src/app/shared/core/directives/platform.directive.spec.ts @@ -0,0 +1,44 @@ +// angular +import { TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; + +// app +import { t } from '../../test/index'; + +// module +import { PlatformDirective } from './platform.directive'; +import { WindowService } from '../../core/index'; +import { WindowMock } from '../../core/testing/index'; + +const testModuleConfig = () => { + TestBed.configureTestingModule({ + declarations: [PlatformDirective, TestComponent] + }); +}; + +@Component({ + viewProviders: [ + { provide: WindowService, useClass: WindowMock } + ], + selector: 'test-cmp', + template: `
` +}) +class TestComponent { } + +export function main() { + t.describe('core: PlatformDirective', () => { + + t.be(testModuleConfig); + + t.it('should add platform class', + t.async(() => { + TestBed.compileComponents() + .then(() => { + let fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + let compDOMEl = fixture.debugElement.children[0].nativeElement; + t.e(compDOMEl.getAttribute('class')).toBe('web'); + }); + })); + }); +} diff --git a/electron/src/app/shared/core/directives/platform.directive.ts b/electron/src/app/shared/core/directives/platform.directive.ts new file mode 100644 index 000000000..e61892d61 --- /dev/null +++ b/electron/src/app/shared/core/directives/platform.directive.ts @@ -0,0 +1,22 @@ +// angular +import { Directive, ElementRef, Renderer } from '@angular/core'; + +// module +import { WindowService } from '../services/window.service'; + +@Directive({ + selector: '[platform]' +}) +export class PlatformDirective { + + constructor(private el: ElementRef, private renderer: Renderer, private win: WindowService) { + let platformClass = 'web'; + let agent = win.navigator.userAgent.toLowerCase(); + if (agent.indexOf('electron') > -1) { + platformClass = 'desktop'; + } else if (agent.indexOf('nativescript') > -1) { + platformClass = 'nativescript'; + } + renderer.setElementClass(el.nativeElement, platformClass, true); + } +} diff --git a/electron/src/app/shared/core/index.ts b/electron/src/app/shared/core/index.ts new file mode 100644 index 000000000..a5c496e4d --- /dev/null +++ b/electron/src/app/shared/core/index.ts @@ -0,0 +1,12 @@ +// utilities +// generally static helpers (non-injectables) +export * from './utils/index'; + +// interfaces +export * from './interfaces/index'; + +// services +export * from './services/index'; + +// directives +export * from './directives/index'; diff --git a/electron/src/app/shared/core/interfaces/iconsole.ts b/electron/src/app/shared/core/interfaces/iconsole.ts new file mode 100644 index 000000000..c3bd634b8 --- /dev/null +++ b/electron/src/app/shared/core/interfaces/iconsole.ts @@ -0,0 +1,8 @@ +// standard console interface +export interface IConsole { + log(m: any): void; + debug(m: any): void; + error(m: any): void; + warn(m: any): void; + info(m: any): void; +} diff --git a/electron/src/app/shared/core/interfaces/ilang.ts b/electron/src/app/shared/core/interfaces/ilang.ts new file mode 100644 index 000000000..968fd254e --- /dev/null +++ b/electron/src/app/shared/core/interfaces/ilang.ts @@ -0,0 +1,5 @@ +// standard language interface +export interface ILang { + code: string; + title: string; +} diff --git a/electron/src/app/shared/core/interfaces/index.ts b/electron/src/app/shared/core/interfaces/index.ts new file mode 100644 index 000000000..5affce021 --- /dev/null +++ b/electron/src/app/shared/core/interfaces/index.ts @@ -0,0 +1,3 @@ +export * from './iconsole'; +export * from './ilang'; +export * from './iwindow'; diff --git a/electron/src/app/shared/core/interfaces/iwindow.ts b/electron/src/app/shared/core/interfaces/iwindow.ts new file mode 100644 index 000000000..667edeb04 --- /dev/null +++ b/electron/src/app/shared/core/interfaces/iwindow.ts @@ -0,0 +1,7 @@ +// standard window interface +export interface IWindow { + navigator: any; + location: any; + alert(msg: string): void; + confirm(msg: string): void; +} diff --git a/electron/src/app/shared/core/services/app.service.ts b/electron/src/app/shared/core/services/app.service.ts new file mode 100644 index 000000000..17ad1a63c --- /dev/null +++ b/electron/src/app/shared/core/services/app.service.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@angular/core'; + +// app +import { AnalyticsService } from '../../../shared/analytics/index'; +import { LogService } from './log.service'; +import { Config } from '../utils/config'; + +@Injectable() +export class AppService { + constructor(public analytics: AnalyticsService, public log: LogService) { + this.log.debug(`AppService -> Config env: ${Config.ENVIRONMENT().ENV}`); + } +} diff --git a/electron/src/app/shared/core/services/console.service.ts b/electron/src/app/shared/core/services/console.service.ts new file mode 100644 index 000000000..127c93fa5 --- /dev/null +++ b/electron/src/app/shared/core/services/console.service.ts @@ -0,0 +1,16 @@ +// angular +import { Injectable } from '@angular/core'; + +// module +import { IConsole } from '../interfaces/iconsole'; + +@Injectable() +export class ConsoleService implements IConsole { + + public log(m: any): void { return; } + public debug(m: any): void { return; } + public error(m: any): void { return; } + public warn(m: any): void { return; } + public info(m: any): void { return; } + +} diff --git a/electron/src/app/shared/core/services/index.ts b/electron/src/app/shared/core/services/index.ts new file mode 100644 index 000000000..ff94ce70e --- /dev/null +++ b/electron/src/app/shared/core/services/index.ts @@ -0,0 +1,20 @@ +// app +import { ConsoleService } from './console.service'; +import { LogService } from './log.service'; +import { RouterExtensions } from './router-extensions.service'; +import { WindowService } from './window.service'; +import { AppService } from './app.service'; + +export const CORE_PROVIDERS: any[] = [ + AppService, + ConsoleService, + LogService, + RouterExtensions, + WindowService +]; + +export * from './app.service'; +export * from './console.service'; +export * from './log.service'; +export * from './router-extensions.service'; +export * from './window.service'; diff --git a/electron/src/app/shared/core/services/log.service.spec.ts b/electron/src/app/shared/core/services/log.service.spec.ts new file mode 100644 index 000000000..b0fb332e3 --- /dev/null +++ b/electron/src/app/shared/core/services/log.service.spec.ts @@ -0,0 +1,125 @@ +// angular +import { TestBed } from '@angular/core/testing'; + +// app +import { t } from '../../test/index'; + +// module +import { Config, ConsoleService, LogService } from '../index'; + +const providers: Array = [ + { provide: ConsoleService, useValue: console }, + LogService +]; + +export function main() { + t.describe('core: LogService', () => { + + t.be(() => { + // ensure statics are in default state + Config.RESET(); + // spy + t.spyOn(console, 'log'); + t.spyOn(console, 'error'); + t.spyOn(console, 'warn'); + t.spyOn(console, 'info'); + + TestBed.configureTestingModule({ + providers: providers + }); + }); + + t.describe('api', () => { + + t.it('sanity', t.inject([LogService], (log: LogService) => { + t.e(log.debug).toBeDefined(); + t.e(log.error).toBeDefined(); + t.e(log.warn).toBeDefined(); + t.e(log.info).toBeDefined(); + })); + + t.it('should not log anything by default', t.inject([LogService], (log: LogService) => { + log.debug('debug'); + t.e(console.log).not.toHaveBeenCalledWith('debug'); + log.error('error'); + t.e(console.error).not.toHaveBeenCalledWith('error'); + log.warn('warn'); + t.e(console.warn).not.toHaveBeenCalledWith('warn'); + log.info('info'); + t.e(console.info).not.toHaveBeenCalledWith('info'); + })); + }); + + t.describe('debug levels', () => { + + t.be(() => { + Config.RESET(); + }); + + t.it('LEVEL_4: everything', t.inject([LogService], (log: LogService) => { + Config.DEBUG.LEVEL_4 = true; + + log.debug('debug'); + t.e(console.log).toHaveBeenCalledWith('debug'); + log.error('error'); + t.e(console.error).toHaveBeenCalledWith('error'); + log.warn('warn'); + t.e(console.warn).toHaveBeenCalledWith('warn'); + log.info('info'); + t.e(console.info).toHaveBeenCalledWith('info'); + })); + + t.it('LEVEL_3: error only', t.inject([LogService], (log: LogService) => { + Config.DEBUG.LEVEL_3 = true; + + log.debug('debug'); + t.e(console.log).not.toHaveBeenCalledWith('debug'); + log.error('error'); + t.e(console.error).toHaveBeenCalledWith('error'); + log.warn('warn'); + t.e(console.warn).not.toHaveBeenCalledWith('warn'); + log.info('info'); + t.e(console.info).not.toHaveBeenCalledWith('info'); + + // always overrides lower levels and allows them to come through + Config.DEBUG.LEVEL_4 = true; + + log.debug('debug w/level_4'); + t.e(console.log).toHaveBeenCalledWith('debug w/level_4'); + log.error('error w/level_4'); + t.e(console.error).toHaveBeenCalledWith('error w/level_4'); + log.warn('warn w/level_4'); + t.e(console.warn).toHaveBeenCalledWith('warn w/level_4'); + log.info('info w/level_4'); + t.e(console.info).toHaveBeenCalledWith('info w/level_4'); + })); + + t.it('LEVEL_2: warn only', t.inject([LogService], (log: LogService) => { + Config.DEBUG.LEVEL_2 = true; + + log.debug('debug'); + t.e(console.log).not.toHaveBeenCalledWith('debug'); + log.error('error'); + t.e(console.error).not.toHaveBeenCalledWith('error'); + log.warn('warn'); + t.e(console.warn).toHaveBeenCalledWith('warn'); + log.info('info'); + t.e(console.info).not.toHaveBeenCalledWith('info'); + })); + + t.it('LEVEL_1: info only', t.inject([LogService], (log: LogService) => { + Config.DEBUG.LEVEL_1 = true; + + log.debug('debug'); + t.e(console.log).not.toHaveBeenCalledWith('debug'); + log.error('error'); + t.e(console.error).not.toHaveBeenCalledWith('error'); + log.warn('warn'); + t.e(console.warn).not.toHaveBeenCalledWith('warn'); + log.info('info'); + t.e(console.info).toHaveBeenCalledWith('info'); + })); + }); + }); + +} diff --git a/electron/src/app/shared/core/services/log.service.ts b/electron/src/app/shared/core/services/log.service.ts new file mode 100644 index 000000000..63b3b96c3 --- /dev/null +++ b/electron/src/app/shared/core/services/log.service.ts @@ -0,0 +1,42 @@ +// angular +import { Injectable, Inject, forwardRef } from '@angular/core'; + +// module +import { Config } from '../utils/config'; +import { ConsoleService } from './console.service'; + +@Injectable() +export class LogService { + + constructor(@Inject(forwardRef(() => ConsoleService)) public logger: ConsoleService) {} + + // debug (standard output) + public debug(msg: any) { + if (Config.DEBUG.LEVEL_4) { + // console.debug does not work on {N} apps... use `log` + this.logger.log(msg); + } + } + + // error + public error(err: any) { + if (Config.DEBUG.LEVEL_4 || Config.DEBUG.LEVEL_3) { + this.logger.error(err); + } + } + + // warn + public warn(err: any) { + if (Config.DEBUG.LEVEL_4 || Config.DEBUG.LEVEL_2) { + this.logger.warn(err); + } + } + + // info + public info(err: any) { + if (Config.DEBUG.LEVEL_4 || Config.DEBUG.LEVEL_1) { + this.logger.info(err); + } + } + +} diff --git a/electron/src/app/shared/core/services/router-extensions.service.ts b/electron/src/app/shared/core/services/router-extensions.service.ts new file mode 100644 index 000000000..fa865b00a --- /dev/null +++ b/electron/src/app/shared/core/services/router-extensions.service.ts @@ -0,0 +1,41 @@ +// angular +import { Injectable } from '@angular/core'; +import { LocationStrategy } from '@angular/common'; +import { Router, UrlTree, NavigationExtras } from '@angular/router'; + +export interface ExtendedNavigationExtras extends NavigationExtras { + // Options for nativescript + clearHistory?: boolean; + animated?: boolean; + transition?: { // See -> https://docs.nativescript.org/api-reference/interfaces/_ui_frame_.navigationtransition.html + name?: string; + instance?: any; + duration?: number; + curve?: any; + }; + // END - Options for nativescript +} + +export interface IRouterExtensions { + navigate(commands: Array, extras?: ExtendedNavigationExtras): Promise; + navigateByUrl(url: string | UrlTree, options?: ExtendedNavigationExtras): Promise; + back(): void; +} + +@Injectable() +export class RouterExtensions implements IRouterExtensions { + + constructor(public router: Router, private locationStrategy: LocationStrategy) { } + + public navigate(commands: Array, extras?: ExtendedNavigationExtras): Promise { + return this.router.navigate(commands, extras); + } + + public navigateByUrl(url: string | UrlTree, options?: ExtendedNavigationExtras): Promise { + return this.router.navigateByUrl(url); + } + + public back() { + this.locationStrategy.back(); + } +} diff --git a/electron/src/app/shared/core/services/window.service.ts b/electron/src/app/shared/core/services/window.service.ts new file mode 100644 index 000000000..1d021f2a6 --- /dev/null +++ b/electron/src/app/shared/core/services/window.service.ts @@ -0,0 +1,15 @@ +// angular +import { Injectable } from '@angular/core'; + +// module +import { IWindow } from '../interfaces/iwindow'; + +@Injectable() +export class WindowService implements IWindow { + + public navigator: any = {}; + public location: any = {}; + public alert(msg: string): void { return; } + public confirm(msg: string): void { return; } + +} diff --git a/electron/src/app/shared/core/testing/index.ts b/electron/src/app/shared/core/testing/index.ts new file mode 100644 index 000000000..df96806e4 --- /dev/null +++ b/electron/src/app/shared/core/testing/index.ts @@ -0,0 +1,9 @@ +// mocks +export * from './mocks/window.mock'; + +// providers +export * from './providers/core'; +export * from './providers/http'; +export * from './providers/router'; + + diff --git a/electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts b/electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts new file mode 100644 index 000000000..fe6b53585 --- /dev/null +++ b/electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts @@ -0,0 +1,77 @@ +/** + * Mock location strategy (until provided by @angular) + * Copied from https://github.com/angular/angular/blob/master/modules/%40angular/common/testing/mock_location_strategy.ts + */ +import { LocationStrategy } from '@angular/common'; +import { Injectable, EventEmitter } from '@angular/core'; + +/** + * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated + * location events. + * + * @stable + */ +@Injectable() +export class MockLocationStrategy extends LocationStrategy { + internalBaseHref: string = '/'; + internalPath: string = '/'; + internalTitle: string = ''; + urlChanges: string[] = []; + /** @internal */ + _subject: EventEmitter = new EventEmitter(); + constructor() { super(); } + + simulatePopState(url: string): void { + this.internalPath = url; + this._subject.emit(new MockPopStateEvent(this.path())); + } + + path(includeHash: boolean = false): string { return this.internalPath; } + + prepareExternalUrl(internal: string): string { + if ((internal).startsWith('/') && (this.internalBaseHref).endsWith('/')) { + return this.internalBaseHref + internal.substring(1); + } + return this.internalBaseHref + internal; + } + + pushState(ctx: any, title: string, path: string, query: string): void { + this.internalTitle = title; + + var url = path + (query.length > 0 ? ('?' + query) : ''); + this.internalPath = url; + + var externalUrl = this.prepareExternalUrl(url); + this.urlChanges.push(externalUrl); + } + + replaceState(ctx: any, title: string, path: string, query: string): void { + this.internalTitle = title; + + var url = path + (query.length > 0 ? ('?' + query) : ''); + this.internalPath = url; + + var externalUrl = this.prepareExternalUrl(url); + this.urlChanges.push('replace: ' + externalUrl); + } + + onPopState(fn: (value: any) => void): void { this._subject.subscribe({next: fn}); } + + getBaseHref(): string { return this.internalBaseHref; } + + back(): void { + if (this.urlChanges.length > 0) { + this.urlChanges.pop(); + var nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : ''; + this.simulatePopState(nextUrl); + } + } + + forward(): void { throw 'not implemented'; } +} + +class MockPopStateEvent { + pop: boolean = true; + type: string = 'popstate'; + constructor(public newUrl: string) {} +} diff --git a/electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts b/electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts new file mode 100644 index 000000000..4ad0d29ab --- /dev/null +++ b/electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts @@ -0,0 +1,30 @@ +export class ConfigMock { + init(): any { + return null; + } + + getSettings(group?: string, key?: string): any { + return { + i18n: { + defaultLanguage: { + code: 'en', + title: 'English' + }, + availableLanguages: [ + { + code: 'en', + title: 'English' + } + ] + }, + logging: { + DEBUG: { + LEVEL_1: false, + LEVEL_2: false, + LEVEL_3: false, + LEVEL_4: false + } + } + }; + } +} diff --git a/electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts b/electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts new file mode 100644 index 000000000..34a41c2a1 --- /dev/null +++ b/electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts @@ -0,0 +1,21 @@ +// angular +import { Injectable } from '@angular/core'; +import { UrlTree } from '@angular/router'; + +// module +import { IRouterExtensions, ExtendedNavigationExtras } from '../../index'; + +@Injectable() +export class RouterExtensionsMock implements IRouterExtensions { + navigate(commands: Array, extras?: ExtendedNavigationExtras): Promise { + return Promise.resolve(true); + } + + navigateByUrl(url: string | UrlTree, options?: ExtendedNavigationExtras): Promise { + return Promise.resolve(true); + } + + back(): void { + return; + } +} diff --git a/electron/src/app/shared/core/testing/mocks/window.mock.ts b/electron/src/app/shared/core/testing/mocks/window.mock.ts new file mode 100644 index 000000000..a15a3251e --- /dev/null +++ b/electron/src/app/shared/core/testing/mocks/window.mock.ts @@ -0,0 +1,27 @@ +export class WindowMock { + public navigator: any = { + language: 'en-US', + userAgent: 'testing' + }; + public location: any = {}; + public alert(msg: string): void { + return; + } + public confirm(msg: string): void { + return; + } +} + +export class WindowMockFrench extends WindowMock { + constructor() { + super(); + this.navigator.language = 'fr-US'; + } +} + +export class WindowMockNoLanguage extends WindowMock { + constructor() { + super(); + this.navigator.language = undefined; + } +} diff --git a/electron/src/app/shared/core/testing/providers/core.ts b/electron/src/app/shared/core/testing/providers/core.ts new file mode 100644 index 000000000..fb4454ebd --- /dev/null +++ b/electron/src/app/shared/core/testing/providers/core.ts @@ -0,0 +1,25 @@ +// app +import { ANALYTICS_PROVIDERS } from '../../../analytics/index'; + +// module +import { WindowService, ConsoleService, LogService, RouterExtensions, AppService } from '../../index'; + +// mocks +import { WindowMock } from '../mocks/window.mock'; +import { RouterExtensionsMock } from '../mocks/router-extensions.mock'; + +export function TEST_CORE_PROVIDERS(options?: any): Array { + // options: + // window: = custom window mock (mainly for changing out language) + + let providers = [ + { provide: ConsoleService, useValue: console }, + { provide: WindowService, useClass: (options && options.window) || WindowMock }, + LogService, + ANALYTICS_PROVIDERS, + { provide: RouterExtensions, useClass: RouterExtensionsMock }, + AppService + ]; + + return providers; +} diff --git a/electron/src/app/shared/core/testing/providers/http.ts b/electron/src/app/shared/core/testing/providers/http.ts new file mode 100644 index 000000000..349e486e9 --- /dev/null +++ b/electron/src/app/shared/core/testing/providers/http.ts @@ -0,0 +1,39 @@ +// angular +import { ReflectiveInjector } from '@angular/core'; +import { BaseRequestOptions, ConnectionBackend, Http } from '@angular/http'; +import { MockBackend } from '@angular/http/testing'; + +let providers: Array = [ + BaseRequestOptions, + MockBackend, + { provide: Http, + useFactory: function (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) { + return new Http(backend, defaultOptions); + }, + deps: [MockBackend, BaseRequestOptions] + } +]; + +/* +* For instances where you need the injector +* @returns `ReflectiveInjector` +*/ +export function GET_HTTP_PROVIDERS_INJECTOR(additionalProviders?: Array): ReflectiveInjector { + + if (additionalProviders) { + providers = providers.concat(additionalProviders); + } + + return ReflectiveInjector.resolveAndCreate(providers); +} + +/* +* For testing http services +* @returns `Array` +*/ +export function TEST_HTTP_PROVIDERS(): Array { + return providers; +} + + + diff --git a/electron/src/app/shared/core/testing/providers/router.ts b/electron/src/app/shared/core/testing/providers/router.ts new file mode 100644 index 000000000..3e4621a70 --- /dev/null +++ b/electron/src/app/shared/core/testing/providers/router.ts @@ -0,0 +1,12 @@ +// angular +import { Location, LocationStrategy, APP_BASE_HREF } from '@angular/common'; +import { SpyLocation, MockLocationStrategy } from '@angular/common/testing'; + +export function TEST_LOCATION_PROVIDERS(): Array { + + return [ + {provide: Location, useClass: SpyLocation}, + {provide: LocationStrategy, useClass: MockLocationStrategy}, + { provide: APP_BASE_HREF, useValue: '/' } + ]; +} diff --git a/electron/src/app/shared/core/utils/config.spec.ts b/electron/src/app/shared/core/utils/config.spec.ts new file mode 100644 index 000000000..d0456b515 --- /dev/null +++ b/electron/src/app/shared/core/utils/config.spec.ts @@ -0,0 +1,38 @@ +// libs +import * as _ from 'lodash'; + +// app +import { t } from '../../test/index'; + +// module +import { Config } from './config'; + +export function main() { + t.describe('core: Config', () => { + t.be(() => Config.RESET()); + + t.it('ENVIRONMENT', () => { + t.e(Config.ENVIRONMENT).toBeDefined(); + }); + t.it('PLATFORMS', () => { + t.e(_.keys(Config.PLATFORMS).length).toBe(4); + t.e(Config.PLATFORM_TARGET).toBeDefined(); + t.e(Config.PLATFORMS.WEB).toBe('web'); + t.e(Config.PLATFORMS.MOBILE_NATIVE).toBe('mobile_native'); + t.e(Config.PLATFORMS.MOBILE_HYBRID).toBe('mobile_hybrid'); + t.e(Config.PLATFORMS.DESKTOP).toBe('desktop'); + + t.e(Config.IS_WEB).toBeDefined(); + t.e(Config.IS_MOBILE_NATIVE).toBeDefined(); + t.e(Config.IS_MOBILE_HYBRID).toBeDefined(); + t.e(Config.IS_DESKTOP).toBeDefined(); + }); + t.it('DEBUG', () => { + t.e(Config.DEBUG.LEVEL_1).toBe(false); + t.e(Config.DEBUG.LEVEL_2).toBe(false); + t.e(Config.DEBUG.LEVEL_3).toBe(false); + t.e(Config.DEBUG.LEVEL_4).toBe(false); + t.e(Config.IS_DEBUG_MODE()).toBe(false); + }); + }); +} diff --git a/electron/src/app/shared/core/utils/config.ts b/electron/src/app/shared/core/utils/config.ts new file mode 100644 index 000000000..b338fab75 --- /dev/null +++ b/electron/src/app/shared/core/utils/config.ts @@ -0,0 +1,78 @@ +// Feel free to extend this interface +// depending on your app specific config. +export interface EnvConfig { + API?: string; + ENV?: string; +} + +export interface IPlatforms { + WEB: string; + MOBILE_NATIVE: string; + MOBILE_HYBRID: string; + DESKTOP: string; +} + +export class Config { + + public static PageClass: any; + + public static DEBUG: any = { + LEVEL_1: false, // .info only + LEVEL_2: false, // .warn only + LEVEL_3: false, // .error only + LEVEL_4: false // .log + all the above + }; + + // supported platforms + public static PLATFORMS: IPlatforms = { + WEB: 'web', + MOBILE_NATIVE: 'mobile_native', + MOBILE_HYBRID: 'mobile_hybrid', + DESKTOP: 'desktop' + }; + + // current target (defaults to web) + public static PLATFORM_TARGET: string = Config.PLATFORMS.WEB; + + // convenient platform checks + public static IS_WEB(): boolean { + return Config.PLATFORM_TARGET === Config.PLATFORMS.WEB; + } + + public static IS_MOBILE_NATIVE(): boolean { + return Config.PLATFORM_TARGET === Config.PLATFORMS.MOBILE_NATIVE; + } + + public static IS_MOBILE_HYBRID(): boolean { + return Config.PLATFORM_TARGET === Config.PLATFORMS.MOBILE_HYBRID; + } + + public static IS_DESKTOP(): boolean { + return Config.PLATFORM_TARGET === Config.PLATFORMS.DESKTOP; + } + + public static ENVIRONMENT(): EnvConfig { + try { + return JSON.parse('<%= ENV_CONFIG %>'); + } catch (exp) { + return {}; + } + } + + public static IS_DEBUG_MODE(): boolean { + for (let key in Config.DEBUG) { + if (Config.DEBUG[key]) { + // if any level is on, debug mode is on + return true; + } + } + return false; + } + + // reset debug defaults + public static RESET() { + for (let key in Config.DEBUG) { + Config.DEBUG[key] = false; + } + } +} diff --git a/electron/src/app/shared/core/utils/index.ts b/electron/src/app/shared/core/utils/index.ts new file mode 100644 index 000000000..7f65f1331 --- /dev/null +++ b/electron/src/app/shared/core/utils/index.ts @@ -0,0 +1,3 @@ +export * from './config'; +export * from './type'; +export * from './view-broker'; diff --git a/electron/src/app/shared/core/utils/type.ts b/electron/src/app/shared/core/utils/type.ts new file mode 100644 index 000000000..8429e8877 --- /dev/null +++ b/electron/src/app/shared/core/utils/type.ts @@ -0,0 +1,20 @@ +/** + * This function coerces a string into a string literal type. + * Using tagged union types in TypeScript 2.0, this enables + * powerful typechecking of our reducers. + * + * Since every action label passes through this function it + * is a good place to ensure all of our action labels + * are unique. + */ + +let typeCache: { [label: string]: boolean } = {}; +export function type(label: T | ''): T { + if (typeCache[label]) { + throw new Error(`Action type "${label}" is not unqiue"`); + } + + typeCache[label] = true; + + return label; +} diff --git a/electron/src/app/shared/core/utils/view-broker.spec.ts b/electron/src/app/shared/core/utils/view-broker.spec.ts new file mode 100644 index 000000000..80668913d --- /dev/null +++ b/electron/src/app/shared/core/utils/view-broker.spec.ts @@ -0,0 +1,28 @@ +// app +import { t } from '../../test/index'; + +// module +import { Config } from './config'; +import { ViewBroker } from './view-broker'; + +export function main() { + t.describe('utilities: ViewBroker', () => { + + t.it('TEMPLATE_URL: web', () => { + Config.PLATFORM_TARGET = Config.PLATFORMS.WEB; + t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.html'); + }); + t.it('TEMPLATE_URL: mobile_native', () => { + Config.PLATFORM_TARGET = Config.PLATFORMS.MOBILE_NATIVE; + t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.tns.html'); + }); + t.it('TEMPLATE_URL: mobile_hybrid', () => { + Config.PLATFORM_TARGET = Config.PLATFORMS.MOBILE_HYBRID; + t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.html'); + }); + t.it('TEMPLATE_URL: desktop', () => { + Config.PLATFORM_TARGET = Config.PLATFORMS.DESKTOP; + t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.html'); + }); + }); +} diff --git a/electron/src/app/shared/core/utils/view-broker.ts b/electron/src/app/shared/core/utils/view-broker.ts new file mode 100644 index 000000000..88ef64fff --- /dev/null +++ b/electron/src/app/shared/core/utils/view-broker.ts @@ -0,0 +1,27 @@ +// module +import { Config } from './config'; + +export class ViewBroker { + + public static TEMPLATE_URL(path: string): string { + if (Config.IS_MOBILE_NATIVE()) { + let paths = path.split('.'); + paths.splice(-1); + return `${paths.join('.')}.tns.html`; + } else { + return path; + } + } + + public static STYLE_URLS(paths: string[]): string[] { + if (Config.IS_MOBILE_NATIVE()) { + return paths.map((path) => { + let parts = path.split('.'); + parts.splice(-1); + return `${parts.join('.')}.tns.css`; + }); + } else { + return paths; + } + } +} diff --git a/electron/src/app/shared/electron/index.ts b/electron/src/app/shared/electron/index.ts new file mode 100644 index 000000000..51ba96e15 --- /dev/null +++ b/electron/src/app/shared/electron/index.ts @@ -0,0 +1,5 @@ +// services +export * from './services/event.service'; + +// utils +export * from './utils/desktop-config'; diff --git a/electron/src/app/shared/electron/services/event.service.ts b/electron/src/app/shared/electron/services/event.service.ts new file mode 100644 index 000000000..a602369a5 --- /dev/null +++ b/electron/src/app/shared/electron/services/event.service.ts @@ -0,0 +1,14 @@ +// libs +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/fromEvent'; + +declare var window: any; + +export class ElectronEventService { + + public static on(name: string): Observable { + return Observable.fromEvent(window, name); + } + + // TODO: add more helpers for menu setup and more... +} diff --git a/electron/src/app/shared/electron/utils/desktop-config.spec.ts b/electron/src/app/shared/electron/utils/desktop-config.spec.ts new file mode 100644 index 000000000..f0504af1b --- /dev/null +++ b/electron/src/app/shared/electron/utils/desktop-config.spec.ts @@ -0,0 +1,16 @@ +import { t } from '../../test/index'; +import { DesktopConfig } from './desktop-config'; + +export function main() { + t.describe('electron: DesktopConfig', () => { + + t.it('SUPPORTED_LANGUAGES', () => { + t.e(DesktopConfig.SUPPORTED_LANGUAGES.length).toBe(5); + t.e(DesktopConfig.SUPPORTED_LANGUAGES[0].code).toBe('en'); + t.e(DesktopConfig.SUPPORTED_LANGUAGES[1].code).toBe('es'); + t.e(DesktopConfig.SUPPORTED_LANGUAGES[2].code).toBe('fr'); + t.e(DesktopConfig.SUPPORTED_LANGUAGES[3].code).toBe('ru'); + t.e(DesktopConfig.SUPPORTED_LANGUAGES[4].code).toBe('bg'); + }); + }); +} diff --git a/electron/src/app/shared/electron/utils/desktop-config.ts b/electron/src/app/shared/electron/utils/desktop-config.ts new file mode 100644 index 000000000..0d5c5290e --- /dev/null +++ b/electron/src/app/shared/electron/utils/desktop-config.ts @@ -0,0 +1,14 @@ +// app +import { ILang } from '../../core/index'; + +export class DesktopConfig { + + public static SUPPORTED_LANGUAGES: Array = [ + { code: 'en', title: 'English' }, + { code: 'es', title: 'Spanish' }, + { code: 'fr', title: 'French' }, + { code: 'ru', title: 'Russian' }, + { code: 'bg', title: 'Bulgarian' } + ]; + +} diff --git a/electron/src/app/shared/i18n/actions/index.ts b/electron/src/app/shared/i18n/actions/index.ts new file mode 100644 index 000000000..f34843159 --- /dev/null +++ b/electron/src/app/shared/i18n/actions/index.ts @@ -0,0 +1 @@ +export * from './multilingual.action'; diff --git a/electron/src/app/shared/i18n/actions/multilingual.action.ts b/electron/src/app/shared/i18n/actions/multilingual.action.ts new file mode 100644 index 000000000..44672ced9 --- /dev/null +++ b/electron/src/app/shared/i18n/actions/multilingual.action.ts @@ -0,0 +1,62 @@ +// libs +import { Action } from '@ngrx/store'; + +// app +import { type } from '../../core/utils/type'; + +// module +import { CATEGORY } from '../common/category.common'; + +/** + * For each action type in an action group, make a simple + * enum object for all of this group's action types. + * + * The 'type' utility function coerces strings into string + * literal types and runs a simple check to guarantee all + * action types in the application are unique. + */ +export interface IMultilingualActions { + CHANGE: string; + LANG_CHANGED: string; + LANG_UNSUPPORTED: string; +} + +export const ActionTypes: IMultilingualActions = { + CHANGE: type(`[${CATEGORY}] Change`), + LANG_CHANGED: type(`[${CATEGORY}] Lang Changed`), + LANG_UNSUPPORTED: type(`[${CATEGORY}] Lang Unsupported`) +}; + +/** + * Every action is comprised of at least a type and an optional + * payload. Expressing actions as classes enables powerful + * type checking in reducer functions. + * + * See Discriminated Unions: https://www.typescriptlang.org/docs/handbook/advanced-types.html#discriminated-unions + */ +export class ChangeAction implements Action { + type = ActionTypes.CHANGE; + + constructor(public payload: string) { } +} + +export class LangChangedAction implements Action { + type = ActionTypes.LANG_CHANGED; + + constructor(public payload: string) { } +} + +export class LangUnsupportedAction implements Action { + type = ActionTypes.LANG_UNSUPPORTED; + + constructor(public payload: string) { } +} + +/** + * Export a type alias of all actions in this action group + * so that reducers can easily compose action types + */ +export type Actions + = ChangeAction + | LangChangedAction + | LangUnsupportedAction; diff --git a/electron/src/app/shared/i18n/common/category.common.ts b/electron/src/app/shared/i18n/common/category.common.ts new file mode 100644 index 000000000..47c76485d --- /dev/null +++ b/electron/src/app/shared/i18n/common/category.common.ts @@ -0,0 +1 @@ +export const CATEGORY: string = 'Multilingual'; diff --git a/electron/src/app/shared/i18n/common/index.ts b/electron/src/app/shared/i18n/common/index.ts new file mode 100644 index 000000000..37587663a --- /dev/null +++ b/electron/src/app/shared/i18n/common/index.ts @@ -0,0 +1 @@ +export * from './category.common'; diff --git a/electron/src/app/shared/i18n/components/index.ts b/electron/src/app/shared/i18n/components/index.ts new file mode 100644 index 000000000..f9eb818ea --- /dev/null +++ b/electron/src/app/shared/i18n/components/index.ts @@ -0,0 +1 @@ +export * from './lang-switcher.component'; diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.html b/electron/src/app/shared/i18n/components/lang-switcher.component.html new file mode 100644 index 000000000..51ddf2260 --- /dev/null +++ b/electron/src/app/shared/i18n/components/lang-switcher.component.html @@ -0,0 +1,5 @@ +
+ Change Language: +
diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.scss b/electron/src/app/shared/i18n/components/lang-switcher.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts b/electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts new file mode 100644 index 000000000..f9274c5bb --- /dev/null +++ b/electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts @@ -0,0 +1,91 @@ +import { TestBed } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { RouterTestingModule } from '@angular/router/testing'; + +// libs +import { StoreModule } from '@ngrx/store'; + +import { t } from '../../test/index'; +import { ILang, WindowService, ConsoleService } from '../../core/index'; +import { CoreModule } from '../../core/core.module'; +import { AnalyticsModule } from '../../analytics/analytics.module'; +import { MultilingualModule } from '../multilingual.module'; +import { MultilingualService, reducer } from '../index'; +import { TEST_MULTILINGUAL_RESET } from '../testing/index'; + +const SUPPORTED_LANGUAGES: Array = [ + { code: 'en', title: 'English' }, + { code: 'es', title: 'Spanish' }, + { code: 'fr', title: 'French' }, + { code: 'ru', title: 'Russian' }, + { code: 'bg', title: 'Bulgarian' } +]; + +// test module configuration for each test +const testModuleConfig = () => { + TestBed.configureTestingModule({ + imports: [ + CoreModule.forRoot([ + { provide: WindowService, useValue: window }, + { provide: ConsoleService, useValue: console } + ]), + RouterTestingModule, + AnalyticsModule, + MultilingualModule, + StoreModule.provideStore({ i18n: reducer }) + ], + declarations: [TestComponent] + }); +}; + +export function main() { + t.describe('i18n:', () => { + t.describe('@Component: LangSwitcherComponent', () => { + t.be(testModuleConfig); + + t.it('should work', + t.async(() => { + TestBed.compileComponents() + .then(() => { + let fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + let appDOMEl = fixture.debugElement.children[0].nativeElement; + t.e(appDOMEl.querySelectorAll('form > select option').length).toBe(1); + t.e(appDOMEl.querySelectorAll('form > select option')[0].value).toBe('en'); + }); + })); + }); + + t.describe('@Component: LangSwitcherComponent with multiple languages', () => { + t.be(() => { + MultilingualService.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES; + testModuleConfig(); + }); + + // ensure statics are reset when the test had modified statics in a beforeEach (be) or beforeEachProvider (bep) + t.ae(() => TEST_MULTILINGUAL_RESET()); + + t.it('should work', + t.async(() => { + TestBed.compileComponents() + .then(() => { + let fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + let appDOMEl = fixture.debugElement.children[0].nativeElement; + t.e(appDOMEl.querySelectorAll('form > select option').length).toBe(5); + t.e(appDOMEl.querySelectorAll('form > select option')[0].value).toBe('en'); + t.e(appDOMEl.querySelectorAll('form > select option')[1].value).toBe('es'); + t.e(appDOMEl.querySelectorAll('form > select option')[2].value).toBe('fr'); + t.e(appDOMEl.querySelectorAll('form > select option')[3].value).toBe('ru'); + t.e(appDOMEl.querySelectorAll('form > select option')[4].value).toBe('bg'); + }); + })); + }); + }); +} + +@Component({ + selector: 'test-cmp', + template: '' +}) +class TestComponent {} diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.html b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.html new file mode 100644 index 000000000..9613fd766 --- /dev/null +++ b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.html @@ -0,0 +1,3 @@ + + + diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss new file mode 100644 index 000000000..c225107a0 --- /dev/null +++ b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss @@ -0,0 +1,10 @@ +.lang-switcher { + background-color: #4f92d5; +} + +.segmented-bar { + background-color: #4f92d5; + color: #fff; + margin: 5; + selected-background-color: #fff; +} diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss new file mode 100644 index 000000000..ed4098596 --- /dev/null +++ b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss @@ -0,0 +1,10 @@ +.lang-switcher { + background-color: #4f92d5; +} + +.segmented-bar { + background-color: #4f92d5; + color: #fff; + margin: 0; + selected-background-color: #fff; +} diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.ts b/electron/src/app/shared/i18n/components/lang-switcher.component.ts new file mode 100644 index 000000000..95ad4f1ee --- /dev/null +++ b/electron/src/app/shared/i18n/components/lang-switcher.component.ts @@ -0,0 +1,50 @@ +// libs +import { Component } from '@angular/core'; +import { Store } from '@ngrx/store'; + +// app +import { Config, ILang } from '../../core/index'; +import { LogService } from '../../core/services/log.service'; +import { IAppState } from '../../ngrx/index'; +import { ElectronEventService } from '../../electron/index'; +import * as multilingual from '../index'; + +@Component({ + moduleId: module.id, + selector: 'lang-switcher', + templateUrl: 'lang-switcher.component.html', + styleUrls: ['lang-switcher.component.css'], +}) +export class LangSwitcherComponent { + + public lang: string; + public supportedLanguages: Array = multilingual.MultilingualService.SUPPORTED_LANGUAGES; + + constructor(private log: LogService, private store: Store) { + store.take(1).subscribe((s: any) => { + // s && s.18n - ensures testing works in all cases (since some tests dont use i18n state) + this.lang = s && s.i18n ? s.i18n.lang : ''; + }); + + if (Config.IS_DESKTOP()) { + // allow electron menu to talk to component + ElectronEventService.on('changeLang').subscribe((e: any) => { + this.changeLang({ target: { value: e.detail.value } }); + }); + } + } + + changeLang(e: any) { + let lang = this.supportedLanguages[0].code; // fallback to default 'en' + + if (Config.IS_MOBILE_NATIVE()) { + if (e) { + lang = this.supportedLanguages[e.newIndex].code; + } + } else if (e && e.target) { + lang = e.target.value; + } + this.log.debug(`Language change: ${lang}`); + this.store.dispatch(new multilingual.ChangeAction(lang)); + } +} diff --git a/electron/src/app/shared/i18n/effects/index.ts b/electron/src/app/shared/i18n/effects/index.ts new file mode 100644 index 000000000..8ebec3dd7 --- /dev/null +++ b/electron/src/app/shared/i18n/effects/index.ts @@ -0,0 +1 @@ +export * from './multilingual.effect'; diff --git a/electron/src/app/shared/i18n/effects/multilingual.effect.ts b/electron/src/app/shared/i18n/effects/multilingual.effect.ts new file mode 100644 index 000000000..25d2da87b --- /dev/null +++ b/electron/src/app/shared/i18n/effects/multilingual.effect.ts @@ -0,0 +1,39 @@ +// angular +import { Injectable } from '@angular/core'; + +// libs +import { Store, Action } from '@ngrx/store'; +import { Effect, Actions } from '@ngrx/effects'; +import { includes, map } from 'lodash'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/map'; + +// module +import { MultilingualService } from '../services/multilingual.service'; +import * as multilingual from '../actions/multilingual.action'; + +@Injectable() +export class MultilingualEffects { + + @Effect() change$: Observable = this.actions$ + .ofType(multilingual.ActionTypes.CHANGE) + .map(action => { + let lang = action.payload; + if (includes(map(MultilingualService.SUPPORTED_LANGUAGES, 'code'), lang)) { + let langChangedAction = new multilingual.LangChangedAction(lang); + // track analytics + this.multilangService.track(langChangedAction.type, { label: langChangedAction.payload }); + // change state + return new multilingual.LangChangedAction(lang); + } else { + // not supported (here for example) + return new multilingual.LangUnsupportedAction(lang); + } + }); + + constructor( + private store: Store, + private actions$: Actions, + private multilangService: MultilingualService + ) { } +} diff --git a/electron/src/app/shared/i18n/index.ts b/electron/src/app/shared/i18n/index.ts new file mode 100644 index 000000000..695d05723 --- /dev/null +++ b/electron/src/app/shared/i18n/index.ts @@ -0,0 +1,17 @@ +// services +export * from './services/index'; + +// components +export * from './components/index'; + +// actions +export * from './actions/index'; + +// effects +export * from './effects/index'; + +// reducers +export * from './reducers/index'; + +// state +export * from './states/index'; diff --git a/electron/src/app/shared/i18n/multilingual.module.ts b/electron/src/app/shared/i18n/multilingual.module.ts new file mode 100644 index 000000000..09ebb1430 --- /dev/null +++ b/electron/src/app/shared/i18n/multilingual.module.ts @@ -0,0 +1,71 @@ +// angular +import { NgModule, ModuleWithProviders, Optional, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { HttpModule, Http } from '@angular/http'; + +// libs +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; + +// app +import { Config } from '../core/index'; + +// module +import { LangSwitcherComponent } from './components/index'; +import { MultilingualService } from './services/index'; + +// for AoT compilation +export function translateLoaderFactory(http: Http) { + return new TranslateHttpLoader(http, `${Config.IS_MOBILE_NATIVE() ? '/' : ''}assets/i18n/`, '.json'); +}; + +/** + * Do not specify providers for modules that might be imported by a lazy loaded module. + */ + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + FormsModule, + HttpModule, + TranslateModule.forRoot([{ + provide: TranslateLoader, + deps: [Http], + useFactory: (translateLoaderFactory) + }]), + ], + declarations: [ + LangSwitcherComponent + ], + exports: [ + LangSwitcherComponent, + TranslateModule + ], + providers: [ + MultilingualService + ], + schemas: [ + NO_ERRORS_SCHEMA, + CUSTOM_ELEMENTS_SCHEMA + ] +}) +export class MultilingualModule { + + // optional usage + // ideally we could use this to override TranslateModule, but it requires the static above at moment + static forRoot(configuredProviders: Array): ModuleWithProviders { + return { + ngModule: MultilingualModule, + providers: configuredProviders + }; + } + + constructor(@Optional() @SkipSelf() parentModule: MultilingualModule) { + if (parentModule) { + throw new Error('MultilingualModule already loaded; Import in root module only.'); + } + } +} diff --git a/electron/src/app/shared/i18n/reducers/index.ts b/electron/src/app/shared/i18n/reducers/index.ts new file mode 100644 index 000000000..b020a11e9 --- /dev/null +++ b/electron/src/app/shared/i18n/reducers/index.ts @@ -0,0 +1 @@ +export * from './multilingual.reducer'; diff --git a/electron/src/app/shared/i18n/reducers/multilingual.reducer.ts b/electron/src/app/shared/i18n/reducers/multilingual.reducer.ts new file mode 100644 index 000000000..2e7e7d18b --- /dev/null +++ b/electron/src/app/shared/i18n/reducers/multilingual.reducer.ts @@ -0,0 +1,20 @@ +// module +import { IMultilingualState, initialState } from '../states/multilingual.state'; +import { Actions, ActionTypes } from '../actions/multilingual.action'; + +export function reducer( + state: IMultilingualState = initialState, + action: Actions +): IMultilingualState { + switch (action.type) { + case ActionTypes.LANG_CHANGED: + if (state.lang !== action.payload) + return (Object).assign({}, state, { + lang: action.payload + }); + + return state; + default: + return state; + } +} diff --git a/electron/src/app/shared/i18n/services/i18n.providers.ts b/electron/src/app/shared/i18n/services/i18n.providers.ts new file mode 100644 index 000000000..cca616364 --- /dev/null +++ b/electron/src/app/shared/i18n/services/i18n.providers.ts @@ -0,0 +1,31 @@ +// import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID } from '@angular/core'; +// +// export class TranslationProviders { +// +// public getTranslationFile = (): Promise => { +// let noProviders: Object[] = []; +// +// // Define a way to retrieve the local information +// let locale: string = 'en-US'; +// +// // Set the directory to the translation files +// let file: string = `../assets/locale/messages.${locale}.xlf`; +// +// if(!locale || locale === 'en-US') return Promise.resolve(noProviders); +// +// return new Promise(function (resolve, reject) { +// let xhr = new XMLHttpRequest; +// xhr.open('GET', file); +// xhr.onload = (data: any) => resolve( +// [ +// { provide: TRANSLATIONS, useValue: data.target.response }, +// { provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }, +// { provide: LOCALE_ID, useValue: locale } +// ] +// ); +// xhr.onerror = () => reject(noProviders); +// xhr.send(); +// }); +// } +// }; +// diff --git a/electron/src/app/shared/i18n/services/index.ts b/electron/src/app/shared/i18n/services/index.ts new file mode 100644 index 000000000..cb96e3c1c --- /dev/null +++ b/electron/src/app/shared/i18n/services/index.ts @@ -0,0 +1 @@ +export * from './multilingual.service'; diff --git a/electron/src/app/shared/i18n/services/multilingual.service.spec.ts b/electron/src/app/shared/i18n/services/multilingual.service.spec.ts new file mode 100644 index 000000000..5c272edec --- /dev/null +++ b/electron/src/app/shared/i18n/services/multilingual.service.spec.ts @@ -0,0 +1,92 @@ +// angular +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +// libs +import { Store, StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; +import { Angulartics2Module } from 'angulartics2'; +import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; + +// app +import { t } from '../../test/index'; +import { CoreModule } from '../../core/core.module'; +import { ILang, WindowService, ConsoleService } from '../../core/index'; +import { TEST_CORE_PROVIDERS, WindowMockFrench } from '../../core/testing/index'; + +// module +import { TEST_MULTILINGUAL_PROVIDERS, TEST_MULTILINGUAL_RESET } from '../testing/index'; +import { IMultilingualState, MultilingualService, MultilingualEffects, reducer, ChangeAction } from '../index'; + +// test module configuration for each test +const testModuleConfig = (options?: any) => { + TestBed.configureTestingModule({ + imports: [ + CoreModule.forRoot([ + { provide: WindowService, useValue: window }, + { provide: ConsoleService, useValue: console } + ]), + Angulartics2Module.forRoot([ + Angulartics2Segment + ]), + StoreModule.provideStore({ i18n: reducer }), + EffectsModule.run(MultilingualEffects), + RouterTestingModule + ], + providers: [ + TEST_CORE_PROVIDERS(options), + TEST_MULTILINGUAL_PROVIDERS() + ] + }); +}; + +export function main() { + t.describe('i18n:', () => { + t.describe('MultilingualService', () => { + + t.be(() => { + testModuleConfig(); + }); + + t.it('should at a minimum support english', () => { + t.e(MultilingualService.SUPPORTED_LANGUAGES.length).toBe(1); + t.e(MultilingualService.SUPPORTED_LANGUAGES[0].code).toBe('en'); + }); + + t.it('changeLang - should not switch unless supported', t.inject([MultilingualService, Store], (multilang: MultilingualService, store: Store) => { + store.dispatch(new ChangeAction('fr')); + // only 'en' supported by default so changing to 'fr' should not change state + store.select('i18n').subscribe((i18n: IMultilingualState) => { + t.e(i18n.lang).toBe('en'); + }); + })); + + }); + + t.describe('MultilingualService for French browser/platform', () => { + const SUPPORTED_LANGUAGES: Array = [ + { code: 'en', title: 'English' }, + { code: 'fr', title: 'French' } + ]; + + t.be(() => { + MultilingualService.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES; + testModuleConfig({ window: WindowMockFrench }); + }); + + // ensure statics are reset when the test had modified statics in a beforeEach (be) or beforeEachProvider (bep) + t.ae(() => TEST_MULTILINGUAL_RESET()); + + t.it('should now support french by default', t.inject([MultilingualService, Store, WindowService], (multilang: MultilingualService, store: Store, win: WindowService) => { + t.e(MultilingualService.SUPPORTED_LANGUAGES.length).toBe(2); + t.e(MultilingualService.SUPPORTED_LANGUAGES[0].code).toBe('en'); + t.e(MultilingualService.SUPPORTED_LANGUAGES[1].code).toBe('fr'); + t.e(win.navigator.language).toBe('fr-US'); + + store.select('i18n').subscribe((i18n: IMultilingualState) => { + t.e(i18n.lang).toBe('fr'); + }); + })); + }); + }); +} diff --git a/electron/src/app/shared/i18n/services/multilingual.service.ts b/electron/src/app/shared/i18n/services/multilingual.service.ts new file mode 100644 index 000000000..b069700a7 --- /dev/null +++ b/electron/src/app/shared/i18n/services/multilingual.service.ts @@ -0,0 +1,52 @@ +// angular +import { Injectable } from '@angular/core'; + +// libs +import { Store } from '@ngrx/store'; +import { TranslateService } from '@ngx-translate/core'; + +// app +import { Analytics, AnalyticsService } from '../../analytics/index'; +import { ILang } from '../../core/index'; +import { WindowService } from '../../core/services/window.service'; + +// module +import { CATEGORY } from '../common/category.common'; +import { IMultilingualState } from '../states/index'; +import { ChangeAction } from '../actions/index'; + +// service +@Injectable() +export class MultilingualService extends Analytics { + + // default supported languages + // see web.module.ts for example of how to provide different value + public static SUPPORTED_LANGUAGES: Array = [ + { code: 'en', title: 'English' } + ]; + + constructor( + public analytics: AnalyticsService, + private translate: TranslateService, + private win: WindowService, + private store: Store + ) { + super(analytics); + this.category = CATEGORY; + + // this language will be used as a fallback when a translation isn't found in the current language + translate.setDefaultLang('en'); + + // use browser/platform lang if available + let userLang = win.navigator.language.split('-')[0]; + + // subscribe to changes + store.select('i18n').subscribe((state: IMultilingualState) => { + // update ng2-translate which will cause translations to occur wherever the TranslatePipe is used in the view + this.translate.use(state.lang); + }); + + // init the lang + this.store.dispatch(new ChangeAction(userLang)); + } +} diff --git a/electron/src/app/shared/i18n/states/index.ts b/electron/src/app/shared/i18n/states/index.ts new file mode 100644 index 000000000..c635f73a4 --- /dev/null +++ b/electron/src/app/shared/i18n/states/index.ts @@ -0,0 +1 @@ +export * from './multilingual.state'; diff --git a/electron/src/app/shared/i18n/states/multilingual.state.ts b/electron/src/app/shared/i18n/states/multilingual.state.ts new file mode 100644 index 000000000..e58aade06 --- /dev/null +++ b/electron/src/app/shared/i18n/states/multilingual.state.ts @@ -0,0 +1,13 @@ +import { Observable } from 'rxjs/Observable'; + +export interface IMultilingualState { + lang: string; +} + +export const initialState: IMultilingualState = { + lang: 'en' +}; + +export function getLang(state$: Observable) { + return state$.select(state => state.lang); +} diff --git a/electron/src/app/shared/i18n/testing/index.ts b/electron/src/app/shared/i18n/testing/index.ts new file mode 100644 index 000000000..2f27376e9 --- /dev/null +++ b/electron/src/app/shared/i18n/testing/index.ts @@ -0,0 +1,27 @@ +// libs +import { TranslateService, TranslateLoader } from '@ngx-translate/core'; + +// module +import { MultilingualService } from '../index'; + +// mocks +import { TranslateMock } from './mocks/ng2-translate.mock'; +import { TranslateLoaderMock } from './mocks/ng2-translate-loader.mock'; + +export function TEST_MULTILINGUAL_PROVIDERS(): Array { + + let providers: Array = [ + { provide: TranslateLoader, useClass: TranslateLoaderMock }, + { provide: TranslateService, useClass: TranslateMock }, + MultilingualService + ]; + + return providers; +} + +export function TEST_MULTILINGUAL_RESET(): void { + // ensure static is reset + MultilingualService.SUPPORTED_LANGUAGES = [ + { code: 'en', title: 'English' } + ]; +} diff --git a/electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts b/electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts new file mode 100644 index 000000000..d54afb7dc --- /dev/null +++ b/electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts @@ -0,0 +1,31 @@ +export class ConfigMockMultilang { + init(): any { + return null; + } + + getSettings(group?: string, key?: string): any { + return { + i18n: { + defaultLanguage: { + code: 'en', + title: 'English' + }, + availableLanguages: [ + { code: 'en', title: 'English' }, + { code: 'es', title: 'Spanish' }, + { code: 'fr', title: 'French' }, + { code: 'ru', title: 'Russian' }, + { code: 'bg', title: 'Bulgarian' } + ] + }, + logging: { + DEBUG: { + LEVEL_1: false, + LEVEL_2: false, + LEVEL_3: false, + LEVEL_4: false + } + } + }; + } +} diff --git a/electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts b/electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts new file mode 100644 index 000000000..a54a8fc6d --- /dev/null +++ b/electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts @@ -0,0 +1,3 @@ +export class TranslateLoaderMock { + +} diff --git a/electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts b/electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts new file mode 100644 index 000000000..b6fce836d --- /dev/null +++ b/electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts @@ -0,0 +1,31 @@ +//angular +import { EventEmitter } from '@angular/core'; + +// libs +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; + +export class TranslateMock { + public onLangChange: EventEmitter = new EventEmitter(); + public onTranslationChange: EventEmitter = new EventEmitter(); + public getTranslation(lang: string): any { + return { + 'TEST': 'test' + }; + } + public use(lang: string) { + // console.log(lang); + } + public get(key: string | Array, interpolateParams?: Object): Observable { + return Observable.of(key); + } + public setDefaultLang(lang: string) { + return; + } + public getLangs() { + return ['en']; + } + public reloadLang(lang: string): Observable { + return Observable.of('en'); + } +} diff --git a/electron/src/app/shared/ngrx/index.ts b/electron/src/app/shared/ngrx/index.ts new file mode 100644 index 000000000..93a071f7b --- /dev/null +++ b/electron/src/app/shared/ngrx/index.ts @@ -0,0 +1,2 @@ +// state +export * from './state/app.state'; diff --git a/electron/src/app/shared/ngrx/state/app.state.ts b/electron/src/app/shared/ngrx/state/app.state.ts new file mode 100644 index 000000000..eb397659b --- /dev/null +++ b/electron/src/app/shared/ngrx/state/app.state.ts @@ -0,0 +1,85 @@ +// libs +import { Observable } from 'rxjs/Observable'; +// import { combineLatest } from 'rxjs/observable/combineLatest'; +import { ActionReducer } from '@ngrx/store'; +import '@ngrx/core/add/operator/select'; + +/** + * The compose function is one of our most handy tools. In basic terms, you give + * it any number of functions and it returns a function. This new function + * takes a value and chains it through every composed function, returning + * the output. + * + * More: https://drboolean.gitbooks.io/mostly-adequate-guide/content/ch5.html + */ +import { compose } from '@ngrx/core/compose'; + +/** + * storeFreeze prevents state from being mutated. When mutation occurs, an + * exception will be thrown. This is useful during development mode to + * ensure that none of the reducers accidentally mutates the state. + */ +import { storeFreeze } from 'ngrx-store-freeze'; + +/** + * combineReducers is another useful metareducer that takes a map of reducer + * functions and creates a new reducer that stores the gathers the values + * of each reducer and stores them using the reducer's key. Think of it + * almost like a database, where every reducer is a table in the db. + * + * More: https://egghead.io/lessons/javascript-redux-implementing-combinereducers-from-scratch + */ +import { combineReducers } from '@ngrx/store'; + +/** + * Every reducer module's default export is the reducer function itself. In + * addition, each module should export a type or interface that describes + * the state of the reducer plus any selector functions. The `* as` + * notation packages up all of the exports into a single object. + */ +import * as fromMultilingual from '../../i18n/index'; +import { IMultilingualState } from '../../i18n/index'; +import * as fromSample from '../../sample/index'; +import { ISampleState } from '../../sample/index'; + +/** + * As mentioned, we treat each reducer like a table in a database. This means + * our top level state interface is just a map of keys to inner state types. + */ +export interface IAppState { + i18n: fromMultilingual.IMultilingualState; + sample: fromSample.ISampleState; +}; + +/** + * Because metareducers take a reducer function and return a new reducer, + * we can use our compose helper to chain them together. Here we are + * using combineReducers to make our top level reducer, and then + * wrapping that in storeLogger. Remember that compose applies + * the result from right to left. + */ +const reducers = { + i18n: fromMultilingual.reducer, + sample: fromSample.reducer +}; + +const developmentReducer: ActionReducer = compose(storeFreeze, combineReducers)(reducers); +const productionReducer: ActionReducer = combineReducers(reducers); + +export function AppReducer(state: any, action: any) { + if (String('<%= BUILD_TYPE %>') === 'dev') { + return developmentReducer(state, action); + } else { + return productionReducer(state, action); + } +} + +export function getMultilingualState(state$: Observable): Observable { + return state$.select(s => s.i18n); +} +export function getNameListState(state$: Observable): Observable { + return state$.select(s => s.sample); +} + +export const getLang: any = compose(fromMultilingual.getLang, getMultilingualState); +export const getNames: any = compose(fromSample.getNames, getNameListState); diff --git a/electron/src/app/shared/sample/actions/index.ts b/electron/src/app/shared/sample/actions/index.ts new file mode 100644 index 000000000..31423efda --- /dev/null +++ b/electron/src/app/shared/sample/actions/index.ts @@ -0,0 +1 @@ +export * from './name-list.action'; diff --git a/electron/src/app/shared/sample/actions/name-list.action.ts b/electron/src/app/shared/sample/actions/name-list.action.ts new file mode 100644 index 000000000..3aa117fcc --- /dev/null +++ b/electron/src/app/shared/sample/actions/name-list.action.ts @@ -0,0 +1,73 @@ +import { Action } from '@ngrx/store'; +import { type } from '../../core/utils/type'; +import { CATEGORY } from '../common/category.common'; + +/** + * For each action type in an action group, make a simple + * enum object for all of this group's action types. + * + * The 'type' utility function coerces strings into string + * literal types and runs a simple check to guarantee all + * action types in the application are unique. + */ +export interface INameListActions { + INIT: string; + INITIALIZED: string; + INIT_FAILED: string; + ADD: string; + NAME_ADDED: string; +} + +export const ActionTypes: INameListActions = { + INIT: type(`${CATEGORY} Init`), + INITIALIZED: type(`${CATEGORY} Initialized`), + INIT_FAILED: type(`${CATEGORY} Init Failed`), + ADD: type(`${CATEGORY} Add`), + NAME_ADDED: type(`${CATEGORY} Name Added`) +}; + +/** + * Every action is comprised of at least a type and an optional + * payload. Expressing actions as classes enables powerful + * type checking in reducer functions. + * + * See Discriminated Unions: https://www.typescriptlang.org/docs/handbook/advanced-types.html#discriminated-unions + */ +export class InitAction implements Action { + type = ActionTypes.INIT; + payload: string = null; +} + +export class InitializedAction implements Action { + type = ActionTypes.INITIALIZED; + + constructor(public payload: Array) { } +} + +export class InitFailedAction implements Action { + type = ActionTypes.INIT_FAILED; + payload: string = null; +} + +export class AddAction implements Action { + type = ActionTypes.ADD; + + constructor(public payload: string) { } +} + +export class NameAddedAction implements Action { + type = ActionTypes.NAME_ADDED; + + constructor(public payload: string) { } +} + +/** + * Export a type alias of all actions in this action group + * so that reducers can easily compose action types + */ +export type Actions + = InitAction + | InitializedAction + | InitFailedAction + | AddAction + | NameAddedAction; diff --git a/electron/src/app/shared/sample/common/category.common.ts b/electron/src/app/shared/sample/common/category.common.ts new file mode 100644 index 000000000..6a9a20f4b --- /dev/null +++ b/electron/src/app/shared/sample/common/category.common.ts @@ -0,0 +1 @@ +export const CATEGORY: string = 'Sample'; diff --git a/electron/src/app/shared/sample/common/index.ts b/electron/src/app/shared/sample/common/index.ts new file mode 100644 index 000000000..37587663a --- /dev/null +++ b/electron/src/app/shared/sample/common/index.ts @@ -0,0 +1 @@ +export * from './category.common'; diff --git a/electron/src/app/shared/sample/components/index.ts b/electron/src/app/shared/sample/components/index.ts new file mode 100644 index 000000000..2e7c9e8f9 --- /dev/null +++ b/electron/src/app/shared/sample/components/index.ts @@ -0,0 +1,10 @@ +import { NavbarComponent } from './navbar.component'; +import { ToolbarComponent } from './toolbar.component'; + +export const SAMPLE_COMPONENTS: any[] = [ + NavbarComponent, + ToolbarComponent +]; + +export * from './navbar.component'; +export * from './toolbar.component'; diff --git a/electron/src/app/shared/sample/components/navbar.component.css b/electron/src/app/shared/sample/components/navbar.component.css new file mode 100644 index 000000000..2e71ed6ca --- /dev/null +++ b/electron/src/app/shared/sample/components/navbar.component.css @@ -0,0 +1,23 @@ +:host { + border-color: #e1e1e1; + border-style: solid; + border-width: 0 0 1px; + display: block; + height: 48px; + padding: 0 16px; +} + +nav a { + color: #8f8f8f; + font-size: 14px; + font-weight: 500; + line-height: 48px; + margin-right: 20px; + text-decoration: none; + vertical-align: middle; + cursor: pointer; +} + +nav a.router-link-active { + color: #106cc8; +} diff --git a/electron/src/app/shared/sample/components/navbar.component.html b/electron/src/app/shared/sample/components/navbar.component.html new file mode 100644 index 000000000..9aa486ce6 --- /dev/null +++ b/electron/src/app/shared/sample/components/navbar.component.html @@ -0,0 +1,5 @@ + + diff --git a/electron/src/app/shared/sample/components/navbar.component.tns.css b/electron/src/app/shared/sample/components/navbar.component.tns.css new file mode 100644 index 000000000..3c0f17d6c --- /dev/null +++ b/electron/src/app/shared/sample/components/navbar.component.tns.css @@ -0,0 +1,12 @@ +.nav { + padding: 10; +} + +.nav button { + margin: 0 20 0 0; + color: #777; +} + +.nav button.active { + color: #106cc8; +} diff --git a/electron/src/app/shared/sample/components/navbar.component.tns.html b/electron/src/app/shared/sample/components/navbar.component.tns.html new file mode 100644 index 000000000..4a7e1ad3a --- /dev/null +++ b/electron/src/app/shared/sample/components/navbar.component.tns.html @@ -0,0 +1,4 @@ + + + + diff --git a/electron/src/app/shared/sample/components/navbar.component.ts b/electron/src/app/shared/sample/components/navbar.component.ts new file mode 100644 index 000000000..bee4e5c8d --- /dev/null +++ b/electron/src/app/shared/sample/components/navbar.component.ts @@ -0,0 +1,13 @@ +// app +import { Component } from '@angular/core'; + +@Component({ + moduleId: module.id, + selector: 'sd-navbar', + templateUrl: 'navbar.component.html', + styleUrls: [ + 'navbar.component.css', + ], +}) +export class NavbarComponent { +} diff --git a/electron/src/app/shared/sample/components/toolbar.component.css b/electron/src/app/shared/sample/components/toolbar.component.css new file mode 100644 index 000000000..a8b28f447 --- /dev/null +++ b/electron/src/app/shared/sample/components/toolbar.component.css @@ -0,0 +1,40 @@ +:host { + background-color: #106cc8; + color: rgba(255, 255, 255, 0.87); + display: block; + height: 48px; + padding: 0 16px; + position: relative; +} + +h1 { + display: inline; + font-size: 20px; + font-weight: normal; + letter-spacing: 0.1px; + line-height: 48px; +} + +:host lang-switcher, +:host .more { + position: absolute; +} + +:host lang-switcher { + top: 13px; + right: 52px; +} + +.more { + background: url("./assets/svg/more.svg"); + top: 12px; + right: 10px; + height: 24px; + width: 24px; + cursor: pointer; + opacity: 0.7; +} + +.more:hover { + opacity: 1; +} diff --git a/electron/src/app/shared/sample/components/toolbar.component.html b/electron/src/app/shared/sample/components/toolbar.component.html new file mode 100644 index 000000000..9420eb758 --- /dev/null +++ b/electron/src/app/shared/sample/components/toolbar.component.html @@ -0,0 +1,3 @@ +

Angular Seed Advanced

+ +
diff --git a/electron/src/app/shared/sample/components/toolbar.component.tns.css b/electron/src/app/shared/sample/components/toolbar.component.tns.css new file mode 100644 index 000000000..f1dd26dc2 --- /dev/null +++ b/electron/src/app/shared/sample/components/toolbar.component.tns.css @@ -0,0 +1,6 @@ +/** + * Intentionally blank. + * Ignore or build out a view and insert in a {N} view to use. + * A file must at least exist since ToolbarComponent is declared in the SampleModule +**/ + diff --git a/electron/src/app/shared/sample/components/toolbar.component.tns.html b/electron/src/app/shared/sample/components/toolbar.component.tns.html new file mode 100644 index 000000000..e5021a003 --- /dev/null +++ b/electron/src/app/shared/sample/components/toolbar.component.tns.html @@ -0,0 +1,9 @@ + + diff --git a/electron/src/app/shared/sample/components/toolbar.component.ts b/electron/src/app/shared/sample/components/toolbar.component.ts new file mode 100644 index 000000000..45b2391de --- /dev/null +++ b/electron/src/app/shared/sample/components/toolbar.component.ts @@ -0,0 +1,21 @@ +import { Component } from '@angular/core'; + +// app +import { LogService } from '../../core/index'; + +@Component({ + moduleId: module.id, + selector: 'sd-toolbar', + templateUrl: 'toolbar.component.html', + styleUrls: [ + 'toolbar.component.css', + ], +}) +export class ToolbarComponent { + + constructor(private log: LogService) {} + + public openLanguages(e: any): void { + this.log.debug('openLanguages'); + } +} diff --git a/electron/src/app/shared/sample/effects/index.ts b/electron/src/app/shared/sample/effects/index.ts new file mode 100644 index 000000000..fc7c0d973 --- /dev/null +++ b/electron/src/app/shared/sample/effects/index.ts @@ -0,0 +1 @@ +export * from './name-list.effect'; diff --git a/electron/src/app/shared/sample/effects/name-list.effect.ts b/electron/src/app/shared/sample/effects/name-list.effect.ts new file mode 100644 index 000000000..e5d9871fc --- /dev/null +++ b/electron/src/app/shared/sample/effects/name-list.effect.ts @@ -0,0 +1,45 @@ +// angular +import { Injectable } from '@angular/core'; + +// libs +import { Store, Action } from '@ngrx/store'; +import { Effect, Actions } from '@ngrx/effects'; +import { Observable } from 'rxjs/Observable'; + +// module +import { NameListService } from '../services/name-list.service'; +import * as nameList from '../actions/name-list.action'; + +@Injectable() +export class NameListEffects { + + /** + * This effect makes use of the `startWith` operator to trigger + * the effect immediately on startup. + */ + @Effect() init$: Observable = this.actions$ + .ofType(nameList.ActionTypes.INIT) + .startWith(new nameList.InitAction) + .switchMap(() => this.nameListService.getNames()) + .map(payload => { + let names = payload; + return new nameList.InitializedAction(names); + }) + // nothing reacting to failure at moment but you could if you want (here for example) + .catch(() => Observable.of(new nameList.InitFailedAction())); + + @Effect() add$: Observable = this.actions$ + .ofType(nameList.ActionTypes.ADD) + .map(action => { + let name = action.payload; + // analytics + this.nameListService.track(nameList.ActionTypes.NAME_ADDED, { label: name }); + return new nameList.NameAddedAction(name); + }); + + constructor( + private store: Store, + private actions$: Actions, + private nameListService: NameListService + ) { } +} diff --git a/electron/src/app/shared/sample/index.ts b/electron/src/app/shared/sample/index.ts new file mode 100644 index 000000000..100c48f07 --- /dev/null +++ b/electron/src/app/shared/sample/index.ts @@ -0,0 +1,17 @@ +// components +export * from './components/index'; + +// services +export * from './services/index'; + +// actions +export * from './actions/index'; + +// effects +export * from './effects/index'; + +// reducers +export * from './reducers/index'; + +// state +export * from './states/index'; diff --git a/electron/src/app/shared/sample/reducers/index.ts b/electron/src/app/shared/sample/reducers/index.ts new file mode 100644 index 000000000..b89e70d39 --- /dev/null +++ b/electron/src/app/shared/sample/reducers/index.ts @@ -0,0 +1 @@ +export * from './name-list.reducer'; diff --git a/electron/src/app/shared/sample/reducers/name-list.reducer.ts b/electron/src/app/shared/sample/reducers/name-list.reducer.ts new file mode 100644 index 000000000..ae9fb93fb --- /dev/null +++ b/electron/src/app/shared/sample/reducers/name-list.reducer.ts @@ -0,0 +1,22 @@ +import { ISampleState, initialState } from '../states/index'; +import * as actions from '../actions/name-list.action'; + +export function reducer( + state: ISampleState = initialState, + action: actions.Actions +): ISampleState { + switch (action.type) { + case actions.ActionTypes.INITIALIZED: + return (Object).assign({}, state, { + names: action.payload + }); + + case actions.ActionTypes.NAME_ADDED: + return (Object).assign({}, state, { + names: [...state.names, action.payload] + }); + + default: + return state; + } +} diff --git a/electron/src/app/shared/sample/sample.module.ts b/electron/src/app/shared/sample/sample.module.ts new file mode 100644 index 000000000..7e947e7da --- /dev/null +++ b/electron/src/app/shared/sample/sample.module.ts @@ -0,0 +1,47 @@ +// angular +import { NgModule, Optional, SkipSelf, NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { HttpModule } from '@angular/http'; +import { RouterModule } from '@angular/router'; + +// app +import { SAMPLE_COMPONENTS } from './components/index'; +import { SAMPLE_PROVIDERS } from './services/index'; +import { MultilingualModule } from '../i18n/multilingual.module'; + +/** + * Do not specify providers for modules that might be imported by a lazy loaded module. + */ + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + HttpModule, + RouterModule, + MultilingualModule, + ], + declarations: [ + SAMPLE_COMPONENTS + ], + providers: [ + SAMPLE_PROVIDERS + ], + schemas: [ + NO_ERRORS_SCHEMA, + CUSTOM_ELEMENTS_SCHEMA + ], + exports: [ + SAMPLE_COMPONENTS, + MultilingualModule + ] +}) +export class SampleModule { + + constructor(@Optional() @SkipSelf() parentModule: SampleModule) { + if (parentModule) { + throw new Error('SampleModule already loaded; Import in root module only.'); + } + } +} diff --git a/electron/src/app/shared/sample/services/app-config.spec.ts b/electron/src/app/shared/sample/services/app-config.spec.ts new file mode 100644 index 000000000..a20caac7e --- /dev/null +++ b/electron/src/app/shared/sample/services/app-config.spec.ts @@ -0,0 +1,16 @@ +import { t } from '../../test/index'; +import { AppConfig } from './app-config'; + +export function main() { + t.describe('app: AppConfig', () => { + + t.it('SUPPORTED_LANGUAGES', () => { + t.e(AppConfig.SUPPORTED_LANGUAGES.length).toBe(5); + t.e(AppConfig.SUPPORTED_LANGUAGES[0].code).toBe('en'); + t.e(AppConfig.SUPPORTED_LANGUAGES[1].code).toBe('es'); + t.e(AppConfig.SUPPORTED_LANGUAGES[2].code).toBe('fr'); + t.e(AppConfig.SUPPORTED_LANGUAGES[3].code).toBe('ru'); + t.e(AppConfig.SUPPORTED_LANGUAGES[4].code).toBe('bg'); + }); + }); +} diff --git a/electron/src/app/shared/sample/services/app-config.ts b/electron/src/app/shared/sample/services/app-config.ts new file mode 100644 index 000000000..7b334bfb6 --- /dev/null +++ b/electron/src/app/shared/sample/services/app-config.ts @@ -0,0 +1,14 @@ +// app +import { ILang } from '../../core/index'; + +export class AppConfig { + + public static SUPPORTED_LANGUAGES: Array = [ + { code: 'en', title: 'English' }, + { code: 'es', title: 'Spanish' }, + { code: 'fr', title: 'French' }, + { code: 'ru', title: 'Russian' }, + { code: 'bg', title: 'Bulgarian' } + ]; + +} diff --git a/electron/src/app/shared/sample/services/index.ts b/electron/src/app/shared/sample/services/index.ts new file mode 100644 index 000000000..a713d124e --- /dev/null +++ b/electron/src/app/shared/sample/services/index.ts @@ -0,0 +1,7 @@ +import { NameListService } from './name-list.service'; + +export const SAMPLE_PROVIDERS: any[] = [ + NameListService +]; + +export * from './name-list.service'; diff --git a/electron/src/app/shared/sample/services/name-list.service.spec.ts b/electron/src/app/shared/sample/services/name-list.service.spec.ts new file mode 100644 index 000000000..d9370e203 --- /dev/null +++ b/electron/src/app/shared/sample/services/name-list.service.spec.ts @@ -0,0 +1,81 @@ +import { TestBed, getTestBed } from '@angular/core/testing'; +import { Injector } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ResponseOptions, Response, XHRBackend, HttpModule } from '@angular/http'; +import { MockBackend, MockConnection } from '@angular/http/testing'; + +// libs +import { Store, StoreModule } from '@ngrx/store'; +import { EffectsTestingModule, EffectsRunner } from '@ngrx/effects/testing'; + +// app +import { t } from '../../test/index'; +// import {TEST_CORE_PROVIDERS, GET_HTTP_PROVIDERS_INJECTOR, TEST_LOCATION_PROVIDERS} from '../../core/testing/index'; +import { AnalyticsModule } from '../../analytics/analytics.module'; +import { NameListService, NameListEffects, reducer, InitAction, InitializedAction, AddAction, NameAddedAction } from '../index'; + +// test module configuration for each test +const testModuleConfig = () => { + TestBed.configureTestingModule({ + imports: [ + FormsModule, AnalyticsModule, + StoreModule.provideStore({ sample: reducer }), + EffectsTestingModule, + HttpModule, RouterTestingModule + ], + providers: [ + NameListService, + NameListEffects, + {provide: XHRBackend, useClass: MockBackend} + ] + }); +}; + +const mockBackendResponse = (connection: MockConnection, response: string) => { + connection.mockRespond(new Response(new ResponseOptions({body: response}))); +}; + +export function main() { + t.describe('app: NameListService', () => { + let injector: Injector; + let backend: MockBackend; + let nameList: NameListService; + let store: Store; + let runner: EffectsRunner; // ngrx/effects tester + let nameListEffects: NameListEffects; + let connection: MockConnection; // this will be set when a new connection is emitted from the backend. + + t.be(() => { + testModuleConfig(); + injector = getTestBed(); + backend = injector.get(XHRBackend); + store = injector.get(Store); + runner = injector.get(EffectsRunner); + nameListEffects = injector.get(NameListEffects); + // sets the connection when someone tries to access the backend with an xhr request + backend.connections.subscribe((c: MockConnection) => connection = c); + // construct after setting up connections above + nameList = injector.get(NameListService); + }); + + t.it('should initialize', () => { + runner.queue(new InitAction()); + + nameListEffects.init$.subscribe(result => { + t.e(result).toEqual(new InitializedAction([ 'Dijkstra', 'Hopper' ])); + }); + + // mock response after the xhr request (which happens in constructor), otherwise it will be undefined + mockBackendResponse(connection, '["Dijkstra", "Hopper"]'); + }); + + t.it('add action', () => { + runner.queue(new AddAction('Minko')); + + nameListEffects.add$.subscribe(result => { + t.e(result).toEqual(new NameAddedAction('Minko')); + }); + }); + }); +} diff --git a/electron/src/app/shared/sample/services/name-list.service.ts b/electron/src/app/shared/sample/services/name-list.service.ts new file mode 100644 index 000000000..fbc61a7c1 --- /dev/null +++ b/electron/src/app/shared/sample/services/name-list.service.ts @@ -0,0 +1,34 @@ +// angular +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; + +// libs +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs/Observable'; + +// app +import { Config } from '../../core/index'; +import { Analytics, AnalyticsService } from '../../analytics/index'; +import { CATEGORY } from '../common/category.common'; + +// module +import { ISampleState } from '../states/index'; +import * as actions from '../actions/name-list.action'; + +@Injectable() +export class NameListService extends Analytics { + + constructor( + public analytics: AnalyticsService, + private store: Store, + private http: Http + ) { + super(analytics); + this.category = CATEGORY; + } + + getNames(): Observable> { + return this.http.get(`${Config.IS_MOBILE_NATIVE() ? '/' : ''}assets/data.json`) + .map(res => res.json()); + } +} diff --git a/electron/src/app/shared/sample/states/index.ts b/electron/src/app/shared/sample/states/index.ts new file mode 100644 index 000000000..e259ba00d --- /dev/null +++ b/electron/src/app/shared/sample/states/index.ts @@ -0,0 +1 @@ +export * from './name-list.state'; diff --git a/electron/src/app/shared/sample/states/name-list.state.ts b/electron/src/app/shared/sample/states/name-list.state.ts new file mode 100644 index 000000000..3bcc2a9db --- /dev/null +++ b/electron/src/app/shared/sample/states/name-list.state.ts @@ -0,0 +1,13 @@ +import { Observable } from 'rxjs/Observable'; + +export interface ISampleState { + names: Array; +} + +export const initialState: ISampleState = { + names: >[] +}; + +export function getNames(state$: Observable) { + return state$.select(state => state.names); +} diff --git a/electron/src/polyfills.ts b/electron/src/polyfills.ts new file mode 100644 index 000000000..e69de29bb diff --git a/electron/src/vendor.ts b/electron/src/vendor.ts new file mode 100644 index 000000000..e69de29bb diff --git a/electron/tools/package.js b/electron/tools/package.js new file mode 100644 index 000000000..a92d117ea --- /dev/null +++ b/electron/tools/package.js @@ -0,0 +1,58 @@ +"use strict"; + +var packager = require('electron-packager'); +const pkg = require('./package.json'); +const argv = require('minimist')(process.argv.slice(2)); +const devDeps = Object.keys(pkg.devDependencies); + +const appName = argv.name || pkg.productName; +const shouldUseAsar = argv.asar || false; +const shouldBuildAll = argv.all || false; +const arch = argv.arch || 'all'; +const platform = argv.platform || 'win32'; + +const DEFAULT_OPTS = { + dir: './src/app', + name: appName, + asar: shouldUseAsar, + ignore: [ + ].concat(devDeps.map(name => `/node_modules/${name}($|/)`)) +}; + +const icon = './src/app/dist/assets/app-icon'; + +if (icon) { + DEFAULT_OPTS.icon = icon; +} + +pack(platform, arch, function done(err, appPath) { + console.log(err); +}); + +function pack(plat, arch, cb) { + // darwin ia32 electron doesn't exist. + if (plat === 'darwin' && arch === 'ia32') return; + + const iconObj = { + icon: DEFAULT_OPTS.icon + (() => { + let extension = '.png'; + if (plat === 'darwin') { + extension = '.icns'; + } else if (plat === 'win32') { + extension = '.ico'; + } + return extension; + })() + }; + + const opts = Object.assign({}, DEFAULT_OPTS, iconObj, { + platform: plat, + arch, + prune: true, + all: shouldBuildAll, + 'app-version': pkg.version || DEFAULT_OPTS.version, + out: `release/${plat}-${arch}` + }); + + packager(opts, cb); +} \ No newline at end of file diff --git a/electron/tools/webpack/helpers.js b/electron/tools/webpack/helpers.js new file mode 100644 index 000000000..b62f83f56 --- /dev/null +++ b/electron/tools/webpack/helpers.js @@ -0,0 +1,40 @@ +var path = require('path'); +var zlib = require('zlib'); + + +// Helper functions + +function hasProcessFlag(flag) { + return process.argv.join('').indexOf(flag) > -1; +} + +function gzipMaxLevel(buffer, callback) { + return zlib['gzip'](buffer, {level: 9}, callback); +} + +function root(args) { + args = Array.prototype.slice.call(arguments, 0); + return path.join.apply(path, [__dirname].concat(args)); +} + +function rootNode(args) { + args = Array.prototype.slice.call(arguments, 0); + return root.apply(path, ['node_modules'].concat(args)); +} + +function prependExt(extensions, args) { + args = args || []; + if (!Array.isArray(args)) { args = [args] } + return extensions.reduce(function(memo, val) { + return memo.concat(val, args.map(function(prefix) { + return prefix + val; + })); + }, ['']); +} + +exports.hasProcessFlag = hasProcessFlag; +exports.gzipMaxLevel = gzipMaxLevel; +exports.root = root; +exports.rootNode = rootNode; +exports.prependExt = prependExt; +exports.prepend = prependExt; \ No newline at end of file diff --git a/electron/tsconfig.json b/electron/tsconfig.json new file mode 100644 index 000000000..4a038d0a1 --- /dev/null +++ b/electron/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "strictNullChecks": false, + "baseUrl": "./src", + "paths": {}, + "lib": [ + "dom", + "es6" + ], + "typeRoots": [ + "node_modules/@types" + ] + }, + "exclude": [ + "release", + "node_modules", + "dist" + ], + "awesomeTypescriptLoaderOptions": { + "forkChecker": true, + "useWebpackText": true + }, + "compileOnSave": false, + "buildOnSave": false, + "atom": { + "rewriteTsconfig": false + } +} diff --git a/electron/webpack.config.js b/electron/webpack.config.js new file mode 100644 index 000000000..2697c14b6 --- /dev/null +++ b/electron/webpack.config.js @@ -0,0 +1,174 @@ +/* + * Helper: root(), and rootDir() are defined at the bottom + */ +const webpack = require('webpack'); +const helpers = require('./helpers'); +const path = require('path'); + +var CopyWebpackPlugin = require('copy-webpack-plugin'); +const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); + +/* + * Config + */ +var config = { + // for faster builds use 'eval' + devtool: 'source-map', + // cache: false, + + // our angular app + entry: { + 'polyfills': './src/polyfills.ts', + 'vendor': './src/vendor.ts', + 'app': './src/app/app', + }, + + // Config for our build files + output: { + path: helpers.root('src/app/dist'), + filename: '[name].js', + sourceMapFilename: '[name].map', + chunkFilename: '[id].chunk.js' + }, + /* + * Options affecting the resolving of modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve + */ + resolve: { + /* + * An array of extensions that should be used to resolve modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve-extensions + */ + extensions: ['.ts', '.js', '.json', '.css', '.html'], + + // An array of directory names to be resolved to the current directory + modules: [helpers.root('src'), 'node_modules'], + + }, + /* + * Options affecting the resolving of modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve + */ + module: { + rules: [ + // Support for .ts files. + { + test: /\.ts$/, + loaders: ['awesome-typescript-loader', 'angular2-template-loader'], + exclude: [/\.(spec|e2e)\.ts$/] + }, + + // Support for *.json files. + { + test: /\.json$/, + loader: 'json-loader' + }, + /* + * Bootstrap 4 loader + */ + { + test: /bootstrap\/dist\/js\/umd\//, + use: 'imports-loader?jQuery=jquery' + }, + + { + test: /\.scss$/, + exclude: /node_modules/, + loaders: ['raw-loader', 'sass-loader'] // sass-loader not scss-loader + }, + + // support for .html antd .css as raw text + { + test: /\.html$/, + loader: 'raw-loader', + exclude: [helpers.root('app/index.html')] + }, + + // support for fonts + { + test: /\.(ttf|eot|svg|woff(2)?)(\?[a-z0-9=&.]+)?$/, + loader: 'file-loader?name=dist/[name]-[hash].[ext]' + }, + + // support for svg icons + { + test: /\.svg/, + loader: 'svg-url-loader' + } + ] + }, + plugins: [ + new webpack.IgnorePlugin(/vertx/), + + // Workaround for angular/angular#11580 + new webpack.ContextReplacementPlugin( + // The (\\|\/) piece accounts for path separators in *nix and Windows + /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/, + helpers.root('./src'), // location of your src + {} // a map of your routes + ), + + // Plugin: CommonsChunkPlugin + // Description: Shares common code between the pages. + // It identifies common modules and put them into a commons chunk. + // + // See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin + // See: https://github.com/webpack/docs/wiki/optimization#multi-page-app + new webpack.optimize.CommonsChunkPlugin({ + name: ['vendor', 'polyfills'], + minChunks: Infinity + }), + // Plugin: CopyWebpackPlugin + // Description: Copy files and directories in webpack. + // + // Copies project static assets. + // + // See: https://www.npmjs.com/package/copy-webpack-plugin + new CopyWebpackPlugin([{ + from: 'src/assets/*/**', + to: 'assets' + },{ + from: 'fonts/*/**', + to: 'fonts' + }]), + /** + * Plugin LoaderOptionsPlugin (experimental) + * + * See: https://gist.github.com/sokra/27b24881210b56bbaff7 + */ + new LoaderOptionsPlugin({ + debug: true, + options: { + /** + * Static analysis linter for TypeScript advanced options configuration + * Description: An extensible linter for the TypeScript language. + * + * See: https://github.com/wbuchwalter/tslint-loader + */ + tslint: { + emitErrors: false, + failOnHint: false, + resourcePath: 'src' + }, + } + }), + ], + // we need this due to problems with es6-shim + node: { + global: true, + progress: false, + crypto: 'empty', + module: false, + clearImmediate: false, + setImmediate: false + } +}; + +/** + * Target Electron + */ +config.target = 'electron-renderer'; +module.exports = config; diff --git a/electron/webpack.test.js b/electron/webpack.test.js new file mode 100644 index 000000000..934e12af3 --- /dev/null +++ b/electron/webpack.test.js @@ -0,0 +1,277 @@ +const helpers = require('./tools/webpack/helpers'); + +/** + * Webpack Plugins + */ +const ProvidePlugin = require('webpack/lib/ProvidePlugin'); +const DefinePlugin = require('webpack/lib/DefinePlugin'); +var ExtractTextPlugin = require("extract-text-webpack-plugin"); + +/** + * Webpack Constants + */ +const ENV = process.env.ENV = process.env.NODE_ENV = 'test'; + +/** + * Webpack configuration + * + * See: http://webpack.github.io/docs/configuration.html#cli + */ +module.exports = { + + /** + * Source map for Karma from the help of karma-sourcemap-loader & karma-webpack + * + * Do not change, leave as is or it wont work. + * See: https://github.com/webpack/karma-webpack#source-maps + */ + devtool: 'inline-source-map', + + /** + * Options affecting the resolving of modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve + */ + resolve: { + + /** + * An array of extensions that should be used to resolve modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve-extensions + */ + extensions: ['', '.ts', '.js'], + + /** + * Make sure root is src + */ + root: helpers.root('src'), + + }, + + /** + * Options affecting the normal modules. + * + * See: http://webpack.github.io/docs/configuration.html#module + */ + module: { + + /** + * An array of applied pre and post loaders. + * + * See: http://webpack.github.io/docs/configuration.html#module-preloaders-module-postloaders + */ + preLoaders: [ + + /** + * Tslint loader support for *.ts files + * + * See: https://github.com/wbuchwalter/tslint-loader + */ + { + test: /\.ts$/, + loader: 'tslint-loader', + exclude: [helpers.root('node_modules')] + }, + + /** + * Source map loader support for *.js files + * Extracts SourceMaps for source files that as added as sourceMappingURL comment. + * + * See: https://github.com/webpack/source-map-loader + */ + { + test: /\.js$/, + loader: 'source-map-loader', + exclude: [ + // these packages have problems with their sourcemaps + helpers.root('node_modules/rxjs'), + helpers.root('node_modules/@angular') + ] + } + + ], + + /** + * An array of automatically applied loaders. + * + * IMPORTANT: The loaders here are resolved relative to the resource which they are applied to. + * This means they are not resolved relative to the configuration file. + * + * See: http://webpack.github.io/docs/configuration.html#module-loaders + */ + loaders: [ + + /** + * Typescript loader support for .ts and Angular 2 async routes via .async.ts + * + * See: https://github.com/s-panferov/awesome-typescript-loader + */ + { + test: /\.ts$/, + loader: 'awesome-typescript-loader', + query: { + compilerOptions: { + + // Remove TypeScript helpers to be injected + // below by DefinePlugin + removeComments: true + + } + }, + exclude: [/\.e2e\.ts$/] + }, + + // Support for *.json files. + { + test: /\.json$/, + loader: 'json-loader' + }, + + // Support for CSS as raw text + { + test: /\.css$/, + loader: 'raw-loader' + }, + + // support for .html as raw text + { + test: /\.html$/, + loader: 'raw-loader', + exclude: [helpers.root('app/index.html')] + }, + + // Support for CSS as raw text + { + test: /\.css$/, + loader: ExtractTextPlugin.extract(['css']) + }, + + // General sass should be included in a css file + { + test: /\.scss$/, + loader: ExtractTextPlugin.extract(['css', 'sass']), + exclude: [ + helpers.root('src/app/components'), + helpers.root('src/app/projects'), + helpers.root('src/app/home'), + helpers.root('src/app/shared'), + helpers.root('src/app/login'), + ] + }, + + // Component specific sass should be included in the component + { + test: /\.scss$/, + loaders: ["css", "sass"], + exclude: [helpers.root('src/app/sass')] + }, + + // Inline base64 URLs for <=8k images, direct URLs for the rest + { + test: /\.(png|jpg|jpeg)$/, + loader: 'url-loader?limit=10000' + }, + + // Font handeling - used in fontawesome and other fonts + , { + test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, + loader: "url?limit=10000&mimetype=application/font-woff" + }, { + test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, + loader: "url?limit=10000&mimetype=application/font-woff" + }, { + test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, + loader: "url?limit=10000&mimetype=application/octet-stream" + }, { + test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, + loader: "file" + }, { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + loader: "url?limit=10000&mimetype=image/svg+xml" + } + + ], + + /** + * An array of applied pre and post loaders. + * + * See: http://webpack.github.io/docs/configuration.html#module-preloaders-module-postloaders + */ + postLoaders: [ + + /** + * Instruments JS files with Istanbul for subsequent code coverage reporting. + * Instrument only testing sources. + * + * See: https://github.com/deepsweet/istanbul-instrumenter-loader + */ + { + test: /\.(js|ts)$/, loader: 'istanbul-instrumenter-loader', + include: helpers.root('src'), + exclude: [ + /\.(e2e|spec)\.ts$/, + /node_modules/ + ] + } + + ] + }, + + /** + * Add additional plugins to the compiler. + * + * See: http://webpack.github.io/docs/configuration.html#plugins + */ + plugins: [ + + /** + * Plugin: DefinePlugin + * Description: Define free variables. + * Useful for having development builds with debug logging or adding global constants. + * + * Environment helpers + * + * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin + */ + // NOTE: when adding more properties make sure you include them in custom-typings.d.ts + new DefinePlugin({ + 'ENV': JSON.stringify(ENV), + 'HMR': false, + 'process.env': { + 'ENV': JSON.stringify(ENV), + 'NODE_ENV': JSON.stringify(ENV), + 'HMR': false, + } + }), + + + ], + + /** + * Static analysis linter for TypeScript advanced options configuration + * Description: An extensible linter for the TypeScript language. + * + * See: https://github.com/wbuchwalter/tslint-loader + */ + tslint: { + emitErrors: false, + failOnHint: false, + resourcePath: 'src' + }, + + /** + * Include polyfills or mocks for various node stuff + * Description: Node configuration + * + * See: https://webpack.github.io/docs/configuration.html#node + */ + node: { + global: 'window', + process: false, + crypto: 'empty', + module: false, + clearImmediate: false, + setImmediate: false + } + +}; \ No newline at end of file diff --git a/nativescript/package.json b/nativescript/package.json index 8ca8c82f0..179fb44c0 100644 --- a/nativescript/package.json +++ b/nativescript/package.json @@ -68,4 +68,4 @@ "webpack": "2.2.0-rc.3", "webpack-sources": "~0.1.3" } -} +} \ No newline at end of file diff --git a/tools/install.js b/tools/install.js index 09274f59c..6a42f09d2 100644 --- a/tools/install.js +++ b/tools/install.js @@ -12,6 +12,7 @@ var path = require('path'); var webAppPath = '../src/client/app'; var webAssetsPath = '../src/client/assets'; var nativescriptAppPath = '../nativescript/src/app/'; +var electronAppPath = '../electron/src/app/'; // Root SymLink Code for Windows if (process.argv.length > 2) { @@ -33,6 +34,9 @@ try { if (fs.existsSync(resolve(nativescriptAppPath))) { fs.unlinkSync(resolve(nativescriptAppPath)); } + if (fs.existsSync(resolve(electronAppPath))) { + fs.unlinkSync(resolve(electronAppPath)); + } } catch (err) { } @@ -105,6 +109,10 @@ function createSymLink() { console.log("Attempting to Symlink", webAppPath, nativescriptAppPath); } fs.symlinkSync(resolve(webAppPath), resolve(nativescriptAppPath), 'junction'); + if (debugging) { + console.log("Attempting to Symlink", webAppPath, electronAppPath); + } + fs.symlinkSync(resolve(webAppPath), resolve(electronAppPath), 'junction'); } /** From 1cf573d4578ac7937580a188766c2feb430c183f Mon Sep 17 00:00:00 2001 From: ianm Date: Tue, 28 Mar 2017 22:40:54 -0400 Subject: [PATCH 02/17] update git ignore for electron dir --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index ca31f6aa9..a73c71a49 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,14 @@ nativescript/src/**/*.js nativescript/src/**/*.js.map nativescript/*.d.ts !nativescript/src/references.d.ts +electron/app +electron/node_modules +electron/platforms +electron/src/app +electron/src/**/*.js +electron/src/**/*.js.map +electron/*.d.ts +!electron/src/references.d.ts desktop gulpfile.js gulpfile.js.map From 90094ff97f55c6c6fcaa0c36281c936ff03fb9dc Mon Sep 17 00:00:00 2001 From: ianm Date: Tue, 28 Mar 2017 22:55:56 -0400 Subject: [PATCH 03/17] webpack polyfills and vendors --- electron/src/polyfills.ts | 24 ++++++++++++++++++++++++ electron/src/vendor.ts | 10 ++++++++++ 2 files changed, 34 insertions(+) diff --git a/electron/src/polyfills.ts b/electron/src/polyfills.ts index e69de29bb..703f389d0 100644 --- a/electron/src/polyfills.ts +++ b/electron/src/polyfills.ts @@ -0,0 +1,24 @@ +// Polyfills +// (these modules are what are in 'angular2/bundles/angular2-polyfills' so don't use that here) + +// import 'ie-shim'; // Internet Explorer +// import 'es6-shim'; +// import 'es6-promise'; +// import 'es7-reflect-metadata'; + +// Prefer CoreJS over the polyfills above +import 'core-js/es6'; +import 'core-js/es7/reflect'; +require('zone.js/dist/zone.js'); +//Error['stackTraceLimit'] = Infinity; + +require('zone.js/dist/long-stack-trace-zone'); + +// RxJS +// to include every operator uncomment +//require('rxjs/Rx'); + +require('rxjs/add/operator/map'); +require('rxjs/add/operator/mergeMap'); +require('rxjs/add/observable/throw'); + diff --git a/electron/src/vendor.ts b/electron/src/vendor.ts index e69de29bb..a17776b2f 100644 --- a/electron/src/vendor.ts +++ b/electron/src/vendor.ts @@ -0,0 +1,10 @@ +// Angular 2 +import '@angular/platform-browser'; +import '@angular/core'; +import '@angular/router'; +import '@angular/http'; + +// RxJS +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/filter'; +import 'rxjs/add/operator/mergeMap'; From 456ef8781055363ebb76aaac9662636fc212180e Mon Sep 17 00:00:00 2001 From: ianm Date: Tue, 28 Mar 2017 23:47:38 -0400 Subject: [PATCH 04/17] config base paths and entry placeholders --- electron/package.json | 8 +- electron/src/app.ts | 4 + electron/src/electron.module.ts | 2 + electron/src/main.desktop.ts | 270 +++++++++++++++++++++++++++ electron/webpack.config.js | 4 +- tools/config/seed-advanced.config.ts | 10 + 6 files changed, 290 insertions(+), 8 deletions(-) create mode 100644 electron/src/app.ts create mode 100644 electron/src/electron.module.ts create mode 100644 electron/src/main.desktop.ts diff --git a/electron/package.json b/electron/package.json index a4d1eb897..474a511c5 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,5 +1,5 @@ { - "name": "angular2-electron", + "name": "angular-seed-advanced", "version": "0.0.0", "description": "Angular 2 with Electron and Webpack", "main": "main.desktop.js", @@ -36,7 +36,7 @@ "zone.js": "^0.7.2" }, "devDependencies": { - "@types/electron": "^1.4.33", + "@types/electron": "^1.4.35", "@types/hammerjs": "^2.0.33", "@types/jasmine": "^2.2.34", "@types/moment-timezone": "^0.2.32", @@ -87,9 +87,5 @@ "webpack": "^2.2.1", "webpack-dev-middleware": "^1.10.1", "webpack-dev-server": "^2.4.1" - }, - "engines": { - "node": ">= 4.2.1 <= 6", - "npm": ">= 3" } } diff --git a/electron/src/app.ts b/electron/src/app.ts new file mode 100644 index 000000000..ef060f220 --- /dev/null +++ b/electron/src/app.ts @@ -0,0 +1,4 @@ +//electron + +//bootstrap entry point... + diff --git a/electron/src/electron.module.ts b/electron/src/electron.module.ts new file mode 100644 index 000000000..2c07aec37 --- /dev/null +++ b/electron/src/electron.module.ts @@ -0,0 +1,2 @@ +//electron +//flesh out for webpack entry.... diff --git a/electron/src/main.desktop.ts b/electron/src/main.desktop.ts new file mode 100644 index 000000000..9a16ad174 --- /dev/null +++ b/electron/src/main.desktop.ts @@ -0,0 +1,270 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'production'; +console.log(`Electron launching with NODE_ENV: ${process.env.NODE_ENV}`); + +// electron +const electron = require('electron'); +const app = electron.app; +const Menu: any = electron.Menu; +const shell: any = electron.shell; +// const {crashReporter} = require('electron'); +const BrowserWindow = electron.BrowserWindow; +let mainWindow: any = null; +let template: any; +let menu: any; + +// app +import { DesktopConfig } from './app/shared/electron/index'; + +// Sample +// You would need a valid `submitURL` to use +// crashReporter.start({ +// productName: 'AngularSeedAdvanced', +// companyName: 'NathanWalker', +// submitURL: 'https://github.com/NathanWalker/angular-seed-advanced', +// autoSubmit: true +// }); + +if (process.env.NODE_ENV === 'development') { + require('electron-debug')(); +} + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('ready', () => { + + // Initialize the window to our specified dimensions + mainWindow = new BrowserWindow({ width: 900, height: 620 }); + + // Tell Electron where to load the entry point from + mainWindow.loadURL('file://' + __dirname + '/index.html'); + + // Clear out the main window when the app is closed + mainWindow.on('closed', () => { + mainWindow = null; + }); + + mainWindow.webContents.on('did-navigate-in-page', (e: any, url: string) => { + console.log(`Page navigated: ${url}`); + }); + + let appTitle: string = `Angular Seed Advanced`; + + let langMenu: any = { + label: 'Language', + submenu: [] + }; + for (var lang of DesktopConfig.SUPPORTED_LANGUAGES) { + let code = lang.code; + let langOption = { + label: lang.title, + click:() => { + console.log(`Change lang: ${code}`); + mainWindow.webContents.executeJavaScript(`window.dispatchEvent(new CustomEvent('changeLang', {detail: { value: '${code}'} }));`); + } + }; + langMenu.submenu.push(langOption); + } + + let helpMenu: any = { + label: 'Help', + submenu: [{ + label: 'Learn More', + click:() => { + shell.openExternal('https://github.com/NathanWalker/angular-seed-advanced'); + } + }, { + label: 'Issues', + click:() => { + shell.openExternal('https://github.com/NathanWalker/angular-seed-advanced/issues'); + } + }, { + label: `My Amazing Parent: Minko Gechev's Angular Seed`, + click:() => { + shell.openExternal('https://github.com/mgechev/angular-seed'); + } + }, { + label: 'Angular 2', + click:() => { + shell.openExternal('https://angular.io/'); + } + }, { + label: 'Electron', + click:() => { + shell.openExternal('http://electron.atom.io/'); + } + }, { + label: 'Electron Docs', + click: () => { + shell.openExternal('https://github.com/atom/electron/tree/master/docs'); + } + }, { + label: 'Codeology Visualization', + click:() => { + shell.openExternal('http://codeology.braintreepayments.com/nathanwalker/angular-seed-advanced'); + } + }] + }; + + if (process.platform === 'darwin') { + template = [{ + label: appTitle, + submenu: [{ + label: `About ${appTitle}`, + selector: 'orderFrontStandardAboutPanel:' + }, { + type: 'separator' + }, { + label: 'Services', + submenu: [] + }, { + type: 'separator' + }, { + label: 'Hide Angular Seed Advanced', + accelerator: 'Command+H', + selector: 'hide:' + }, { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:' + }, { + label: 'Show All', + selector: 'unhideAllApplications:' + }, { + type: 'separator' + }, { + label: 'Quit', + accelerator: 'Command+Q', + click:() => { + app.quit(); + } + }] + }, { + label: 'Edit', + submenu: [{ + label: 'Undo', + accelerator: 'Command+Z', + selector: 'undo:' + }, { + label: 'Redo', + accelerator: 'Shift+Command+Z', + selector: 'redo:' + }, { + type: 'separator' + }, { + label: 'Cut', + accelerator: 'Command+X', + selector: 'cut:' + }, { + label: 'Copy', + accelerator: 'Command+C', + selector: 'copy:' + }, { + label: 'Paste', + accelerator: 'Command+V', + selector: 'paste:' + }, { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:' + }] + }, { + label: 'View', + submenu: (process.env.NODE_ENV === 'development') ? [{ + label: 'Reload', + accelerator: 'Command+R', + click:() => { + mainWindow.reload(); + } + }, { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }, { + label: 'Toggle Developer Tools', + accelerator: 'Alt+Command+I', + click:() => { + mainWindow.toggleDevTools(); + } + }] : [{ + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }] + }, { + label: 'Window', + submenu: [{ + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:' + }, { + label: 'Close', + accelerator: 'Command+W', + selector: 'performClose:' + }, { + type: 'separator' + }, { + label: 'Bring All to Front', + selector: 'arrangeInFront:' + }] + }, + langMenu, + helpMenu]; + + menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + } else { + template = [{ + label: '&File', + submenu: [{ + label: '&Open', + accelerator: 'Ctrl+O' + }, { + label: '&Close', + accelerator: 'Ctrl+W', + click:() => { + mainWindow.close(); + } + }] + }, { + label: '&View', + submenu: (process.env.NODE_ENV === 'development') ? [{ + label: '&Reload', + accelerator: 'Ctrl+R', + click:() => { + mainWindow.reload(); + } + }, { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }, { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click:() => { + mainWindow.toggleDevTools(); + } + }] : [{ + label: 'Toggle &Full Screen', + accelerator: 'F11', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }] + }, + langMenu, + helpMenu]; + menu = Menu.buildFromTemplate(template); + mainWindow.setMenu(menu); + } + +}); diff --git a/electron/webpack.config.js b/electron/webpack.config.js index 2697c14b6..70ffe2e4f 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -2,7 +2,7 @@ * Helper: root(), and rootDir() are defined at the bottom */ const webpack = require('webpack'); -const helpers = require('./helpers'); +const helpers = require('./tools/webpack/helpers'); const path = require('path'); var CopyWebpackPlugin = require('copy-webpack-plugin'); @@ -20,7 +20,7 @@ var config = { entry: { 'polyfills': './src/polyfills.ts', 'vendor': './src/vendor.ts', - 'app': './src/app/app', + 'app': './src/main.desktop.ts', }, // Config for our build files diff --git a/tools/config/seed-advanced.config.ts b/tools/config/seed-advanced.config.ts index 859a76eb4..25e3dca72 100644 --- a/tools/config/seed-advanced.config.ts +++ b/tools/config/seed-advanced.config.ts @@ -21,6 +21,16 @@ export class SeedAdvancedConfig extends SeedConfig { ANALYTICS_TRACKING_ID: '', }; + /** + * The base folder of the electron application source files. + * @type {string} + */ + ELECTRON_BASE_DIR = 'electron'; + + ELECTRON_APP_SRC = `${this.ELECTRON_BASE_DIR}/${this.srcSubdir}`; + + ELECTRON_APP_DEST = `${this.ELECTRON_BASE_DIR}/${this.destSubdir}`; + /** * Holds added packages for desktop build. */ From ce9aac1eb78d7c8419b95ecc42f5a654dc9a7d41 Mon Sep 17 00:00:00 2001 From: ianm Date: Wed, 29 Mar 2017 09:48:30 -0400 Subject: [PATCH 05/17] electron module and intermediate --- electron/src/app.ts | 6 +- electron/src/components.module.ts | 57 ++++++++++++++++++ electron/src/electron.module.ts | 97 ++++++++++++++++++++++++++++++- electron/webpack.config.js | 2 +- 4 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 electron/src/components.module.ts diff --git a/electron/src/app.ts b/electron/src/app.ts index ef060f220..c2989bb74 100644 --- a/electron/src/app.ts +++ b/electron/src/app.ts @@ -1,4 +1,6 @@ //electron +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +// app +import { ElectronModule } from './electron.module'; -//bootstrap entry point... - +platformBrowserDynamic().bootstrapModule(ElectronModule); diff --git a/electron/src/components.module.ts b/electron/src/components.module.ts new file mode 100644 index 000000000..c1f00823d --- /dev/null +++ b/electron/src/components.module.ts @@ -0,0 +1,57 @@ +//electron +// angular +import { NgModule } from '@angular/core'; +import { Http, HttpModule } from '@angular/http'; +import { FormsModule } from '@angular/forms'; + +// libs +import { TranslateLoader } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; + +// app +import { AppComponent } from './app/components/app.component'; +import { AboutComponent } from './app/components/about/about.component'; +import { HomeComponent } from './app/components/home/home.component'; +import { routes } from './app/components/app.routes'; + +// feature modules +import { CoreModule } from './app/shared/core/core.module'; +import { AnalyticsModule } from './app/shared/analytics/analytics.module'; +import { MultilingualModule, translateLoaderFactory } from './app/shared/i18n/multilingual.module'; +import { SampleModule } from './app/shared/sample/sample.module'; + +// intermediate component module +// helps encapsulate custom native modules in with the components +// note: couple ways this could be done, just one option presented here... +@NgModule({ + imports: [ + FormsModule, + HttpModule, + AnalyticsModule, + CoreModule, + MultilingualModule.forRoot([{ + provide: TranslateLoader, + deps: [Http], + useFactory: (translateLoaderFactory) + }]), + SampleModule + ], + declarations: [ + AppComponent, + HomeComponent, + AboutComponent + ], + exports: [ + MultilingualModule, + AppComponent, + AnalyticsModule, + CoreModule, + SampleModule + ] +}) +export class ComponentsModule { } + +// For AoT compilation to work: +export function cons() { + return console; +} diff --git a/electron/src/electron.module.ts b/electron/src/electron.module.ts index 2c07aec37..144e54eab 100644 --- a/electron/src/electron.module.ts +++ b/electron/src/electron.module.ts @@ -1,2 +1,97 @@ //electron -//flesh out for webpack entry.... +// angular +import { NgModule } from '@angular/core'; +import { APP_BASE_HREF } from '@angular/common'; +import { BrowserModule } from '@angular/platform-browser'; +import { RouterModule } from '@angular/router'; +import { Http } from '@angular/http'; + +// libs +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreDevtoolsModule } from '@ngrx/store-devtools'; +import { TranslateLoader } from '@ngx-translate/core'; + +// app +import { AppComponent } from './app/components/app.component'; +import { routes } from './app/components/app.routes'; + +// feature modules +import { CoreModule } from './app/shared/core/core.module'; +import { AppReducer } from './app/shared/ngrx/index'; +import { AnalyticsModule } from './app/shared/analytics/analytics.module'; +import { MultilingualModule, translateLoaderFactory } from './app/shared/i18n/multilingual.module'; +import { MultilingualEffects } from './app/shared/i18n/index'; +import { SampleModule } from './app/shared/sample/sample.module'; +import { NameListEffects } from './app/shared/sample/index'; + +// config +import { Config, WindowService, ConsoleService } from './app/shared/core/index'; +Config.PLATFORM_TARGET = Config.PLATFORMS.WEB; +if (String('<%= BUILD_TYPE %>') === 'dev') { + // only output console logging in dev mode + Config.DEBUG.LEVEL_4 = true; +} + +// sample config (extra) +import { AppConfig } from './app/shared/sample/services/app-config'; +import { MultilingualService } from './app/shared/i18n/services/multilingual.service'; +// custom i18n language support +MultilingualService.SUPPORTED_LANGUAGES = AppConfig.SUPPORTED_LANGUAGES; + +let routerModule = RouterModule.forRoot(routes); + +if (String('<%= TARGET_DESKTOP %>') === 'true') { + Config.PLATFORM_TARGET = Config.PLATFORMS.DESKTOP; + // desktop (electron) must use hash + routerModule = RouterModule.forRoot(routes, { useHash: true }); +} + +declare var window, console; + +// For AoT compilation to work: +export function win() { + return window; +} +export function cons() { + return console; +} + +let DEV_IMPORTS: any[] = []; + +if (String('<%= BUILD_TYPE %>') === 'dev') { + DEV_IMPORTS = [ + ...DEV_IMPORTS, + StoreDevtoolsModule.instrumentOnlyWithExtension() + ]; +} + +@NgModule({ + imports: [ + BrowserModule, + CoreModule.forRoot([ + { provide: WindowService, useFactory: (win) }, + { provide: ConsoleService, useFactory: (cons) } + ]), + routerModule, + AnalyticsModule, + MultilingualModule.forRoot([{ + provide: TranslateLoader, + deps: [Http], + useFactory: (translateLoaderFactory) + }]), + StoreModule.provideStore(AppReducer), + DEV_IMPORTS, + EffectsModule.run(MultilingualEffects), + EffectsModule.run(NameListEffects) + ], + providers: [ + { + provide: APP_BASE_HREF, + useValue: '<%= APP_BASE %>' + } + ], + bootstrap: [AppComponent] +}) + +export class ElectronModule { } diff --git a/electron/webpack.config.js b/electron/webpack.config.js index 70ffe2e4f..7f04b28f6 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -20,7 +20,7 @@ var config = { entry: { 'polyfills': './src/polyfills.ts', 'vendor': './src/vendor.ts', - 'app': './src/main.desktop.ts', + 'app': './src/app.ts', }, // Config for our build files From e341a2c69b0624f8d82c411dbbcf420c39c627a9 Mon Sep 17 00:00:00 2001 From: ianm Date: Wed, 29 Mar 2017 12:58:37 -0400 Subject: [PATCH 06/17] base tasks --- tools/config/seed-advanced.config.ts | 21 +++--- tools/tasks/project/desktop.build.ts | 82 +++++++++++++++++---- tools/tasks/seed/build.assets.elec.ts | 54 ++++++++++++++ tools/tasks/seed/build.elec_html_css.ts | 95 +++++++++++++++++++++++++ tools/tasks/seed/build.js.elec.ts | 73 +++++++++++++++++++ 5 files changed, 303 insertions(+), 22 deletions(-) create mode 100644 tools/tasks/seed/build.assets.elec.ts create mode 100644 tools/tasks/seed/build.elec_html_css.ts create mode 100644 tools/tasks/seed/build.js.elec.ts diff --git a/tools/config/seed-advanced.config.ts b/tools/config/seed-advanced.config.ts index 25e3dca72..15ae8a2a5 100644 --- a/tools/config/seed-advanced.config.ts +++ b/tools/config/seed-advanced.config.ts @@ -25,15 +25,18 @@ export class SeedAdvancedConfig extends SeedConfig { * The base folder of the electron application source files. * @type {string} */ - ELECTRON_BASE_DIR = 'electron'; + ELECTRON_BASE_DIR = 'electron'; - ELECTRON_APP_SRC = `${this.ELECTRON_BASE_DIR}/${this.srcSubdir}`; + ELECTRON_APP_SRC = `${this.ELECTRON_BASE_DIR}/${this.srcSubdir}`; - ELECTRON_APP_DEST = `${this.ELECTRON_BASE_DIR}/${this.destSubdir}`; + ELECTRON_APP_DEST = `${this.ELECTRON_BASE_DIR}/${this.destSubdir}`; - /** - * Holds added packages for desktop build. - */ + ELECTRON_CONFIG = { + ANALYTICS_TRACKING_ID: '', + }; + /** + * Holds added packages for desktop build. + */ DESKTOP_PACKAGES: ExtendPackages[] = []; constructor() { @@ -57,7 +60,7 @@ export class SeedAdvancedConfig extends SeedConfig { if (this.TARGET_MOBILE_HYBRID) { // Perhaps Ionic or Cordova // This is not implemented in the seed but here to show you way forward if you wanted to add - bootstrap = 'main.mobile.hybrid'; + bootstrap = 'main.mobile.hybrid'; } if (argv['analytics']) { @@ -158,10 +161,10 @@ export class SeedAdvancedConfig extends SeedConfig { * Need to duplicate this in the project.config.ts to * pick up packages there too. */ - this.DESKTOP_PACKAGES = [ + this.DESKTOP_PACKAGES = [ ...this.DESKTOP_PACKAGES, ...additionalPackages, - ]; + ]; this.addPackagesBundles(additionalPackages); diff --git a/tools/tasks/project/desktop.build.ts b/tools/tasks/project/desktop.build.ts index 6e91b69cb..96c7caa2a 100644 --- a/tools/tasks/project/desktop.build.ts +++ b/tools/tasks/project/desktop.build.ts @@ -1,17 +1,73 @@ import * as gulp from 'gulp'; -import { join } from 'path'; -var newer = require('gulp-newer'); +import * as gulpLoadPlugins from 'gulp-load-plugins'; +import * as merge from 'merge-stream'; +import * as fs from 'fs'; +import * as path from 'path'; import Config from '../../config'; +import { makeTsProject, TemplateLocalsBuilder } from '../../utils'; +import { TypeScriptTask } from '../typescript_task'; -export = () => { - let src = [ - join(Config.APP_SRC, 'package.json') - ]; - return gulp.src(src) - .pipe(newer({ - dest: Config.APP_DEST, - map: function(path: String) { return path.replace('.ts', '.js').replace('.scss', '.css'); } - })) - .pipe(gulp.dest(Config.APP_DEST)); -}; +const plugins = gulpLoadPlugins(); + +const jsonSystemConfig = JSON.stringify(Config.ELECTRON_CONFIG); + +/** + * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development + * environment. + */ +export = + class BuildJsDev extends TypeScriptTask { + run() { + const src = [ + '**/*.ts', + 'app/**/*.ts', + '!**/*.spec.ts', + '!app/**/*.spec.ts', + '!**/*.e2e-spec.ts', + '!app/**/*.e2e-spec.ts', + '!app/shared/test/**/*', + `!**/${Config.NG_FACTORY_FILE}.ts`, + ]; + + const tsProject = makeTsProject({}, Config.ELECTRON_APP_SRC); + + const result = gulp.src([ + ...src, + '!**/*.aot.ts', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(plugins.sourcemaps.init()) + .pipe(tsProject()); + + const template = (Object).assign( + new TemplateLocalsBuilder().withStringifiedSystemConfigDev().build(), { + SYSTEM_CONFIG_ELECTRON: jsonSystemConfig + }, + ); + + const transpiled = result.js + .pipe(plugins.sourcemaps.write()) + // Use for debugging with Webstorm/IntelliJ + // https://github.com/mgechev/angular-seed/issues/1220 + // .pipe(plugins.sourcemaps.write('.', { + // includeContent: false, + // sourceRoot: (file: any) => + // relative(file.path, PROJECT_ROOT + '/' + APP_SRC).replace(sep, '/') + '/' + APP_SRC + // })) + .pipe(plugins.template(template)) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); + + const copy = gulp.src(src, { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); + + fs.writeFileSync(path.join(Config.ELECTRON_APP_DEST, 'build-config.json'), JSON.stringify(template)); + + return merge(transpiled, copy); + } + }; diff --git a/tools/tasks/seed/build.assets.elec.ts b/tools/tasks/seed/build.assets.elec.ts new file mode 100644 index 000000000..3af398181 --- /dev/null +++ b/tools/tasks/seed/build.assets.elec.ts @@ -0,0 +1,54 @@ +import * as gulp from 'gulp'; +import * as merge from 'merge-stream'; +import { join } from 'path'; +import * as newer from 'gulp-newer'; + +import { AssetsTask } from '../assets_task'; +import Config from '../../config'; + +function copyFiles(paths: string[], subdir: string) { + const dest = join(Config.ELECTRON_APP_DEST, subdir); + + return gulp.src(paths) + .pipe(newer(dest)) + .pipe(gulp.dest(dest)); +} + +function copyAssets() { + const paths: string[] = [ + join(Config.APP_SRC, 'assets', '**'), + '!' + join(Config.APP_SRC, 'assets', 'icons', '**', '*'), + ].concat(Config.TEMP_FILES.map((p) => { return '!' + p; })); + + return copyFiles(paths, 'assets'); +} + +function copyAppResources() { + const paths: string[] = [ + join(Config.ELECTRON_APP_SRC, 'App_Resources', '**'), + ]; + + return copyFiles(paths, 'App_Resources'); +} + +function copyAppFonts() { + const paths: string[] = [ + join(Config.ELECTRON_APP_SRC, 'fonts', '**', '*.otf'), + join(Config.ELECTRON_APP_SRC, 'fonts', '**', '*.ttf'), + ]; + + return copyFiles(paths, 'fonts'); +} + +export = + class BuildElectronAssetsTask extends AssetsTask { + run() { + return merge( + copyAssets(), + copyAppResources(), + copyAppFonts(), + copyFiles([join(Config.ELECTRON_APP_SRC, 'package.json')], ''), + ); + } + }; + diff --git a/tools/tasks/seed/build.elec_html_css.ts b/tools/tasks/seed/build.elec_html_css.ts new file mode 100644 index 000000000..710475dd1 --- /dev/null +++ b/tools/tasks/seed/build.elec_html_css.ts @@ -0,0 +1,95 @@ +import * as gulp from 'gulp'; +import * as gulpLoadPlugins from 'gulp-load-plugins'; +import * as merge from 'merge-stream'; +import * as util from 'gulp-util'; +import * as rename from 'gulp-rename'; + +import Config from '../../config'; +import { CssTask } from '../css_task'; + +const plugins = gulpLoadPlugins(); +const reportPostCssError = (e: any) => util.log(util.colors.red(e.message)); + +function renamer() { + return rename((path: any) => { + path.basename = path.basename.replace(/\.elec/, ''); + }); +} +/** + * For any electron only views '*.elec.html' + */ + +function prepareTemplates() { + return gulp.src([ + '**/*.html', + 'app/**/*.html', + '!app/**/*.component.html', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(renamer()) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); +} + +function processComponentStylesheets() { + return Config.ENABLE_SCSS ? + merge( + processComponentScss(), + processComponentCss()) + : + processComponentCss(); +} + +function processComponentCss() { + return gulp.src([ + '**/*.css', + 'app/**/*.css', + '!app/**/*.component.css', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(renamer()) + .on('error', reportPostCssError) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); +} + +/** + * Process scss files referenced from Angular component `styleUrls` metadata + */ +function processComponentScss() { + const stream = gulp.src([ + '**/*.scss', + 'app/**/*.scss', + '!app/**/*.component.scss', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(plugins.sourcemaps.init()) + .pipe(plugins.sass(Config.getPluginConfig('gulp-sass')).on('error', plugins.sass.logError)) + .pipe(plugins.sourcemaps.write()); + + return stream + .pipe(renamer()) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); +} + + +export = + class BuildElectronCSS extends CssTask { + shallRun(files: String[]) { + // Only run if tns-resources + return files.some((f) => + // tns.html, tns.scss or tns.css under nativescript/src/app + (f.indexOf('electron/src/app') !== -1 && !!f.match(/\.elec\.(s?css|html)$/)) || + // .html, .scss or .css NOT under nativescript/src/app + (f.indexOf('electron/src/app') === -1 && !!f.match(/\.(s?css|html)$/)) + ); + } + + run() { + return merge(processComponentStylesheets(), prepareTemplates()); + } + }; diff --git a/tools/tasks/seed/build.js.elec.ts b/tools/tasks/seed/build.js.elec.ts new file mode 100644 index 000000000..b0ee52a41 --- /dev/null +++ b/tools/tasks/seed/build.js.elec.ts @@ -0,0 +1,73 @@ +import * as gulp from 'gulp'; +import * as gulpLoadPlugins from 'gulp-load-plugins'; +import * as merge from 'merge-stream'; +import * as fs from 'fs'; +import * as path from 'path'; + +import Config from '../../config'; +import { makeTsProject, TemplateLocalsBuilder } from '../../utils'; +import { TypeScriptTask } from '../typescript_task'; + +const plugins = gulpLoadPlugins(); + +const jsonSystemConfig = JSON.stringify(Config.ELECTRON_CONFIG); + +/** + * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development + * environment. + */ +export = + class BuildJsDev extends TypeScriptTask { + run() { + const src = [ + '**/*.ts', + 'app/**/*.ts', + '!**/*.spec.ts', + '!app/**/*.spec.ts', + '!**/*.e2e-spec.ts', + '!app/**/*.e2e-spec.ts', + '!app/shared/test/**/*', + `!**/${Config.NG_FACTORY_FILE}.ts`, + ]; + + const tsProject = makeTsProject({}, Config.ELECTRON_APP_SRC); + + const result = gulp.src([ + ...src, + '!**/*.aot.ts', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(plugins.sourcemaps.init()) + .pipe(tsProject()); + + const template = (Object).assign( + new TemplateLocalsBuilder().withStringifiedSystemConfigDev().build(), { + SYSTEM_CONFIG_TNS: jsonSystemConfig + }, + ); + + const transpiled = result.js + .pipe(plugins.sourcemaps.write()) + // Use for debugging with Webstorm/IntelliJ + // https://github.com/mgechev/angular-seed/issues/1220 + // .pipe(plugins.sourcemaps.write('.', { + // includeContent: false, + // sourceRoot: (file: any) => + // relative(file.path, PROJECT_ROOT + '/' + APP_SRC).replace(sep, '/') + '/' + APP_SRC + // })) + .pipe(plugins.template(template)) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); + + const copy = gulp.src(src, { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); + + fs.writeFileSync(path.join(Config.ELECTRON_APP_DEST, 'build-config.json'), JSON.stringify(template)); + + return merge(transpiled, copy); + } + }; From 94cfc7268e931ba3c82e98c5db0aebfae6ced500 Mon Sep 17 00:00:00 2001 From: ianm Date: Wed, 29 Mar 2017 13:15:43 -0400 Subject: [PATCH 07/17] cleanup and fix assets task --- .../app/components/about/about.component.html | 21 --- .../app/components/about/about.component.scss | 20 --- .../components/about/about.component.spec.ts | 39 ---- .../components/about/about.component.tns.html | 27 --- .../components/about/about.component.tns.scss | 15 -- .../app/components/about/about.component.ts | 33 ---- .../src/app/components/about/about.routes.ts | 8 - .../src/app/components/app.component.html | 5 - .../src/app/components/app.component.spec.ts | 76 -------- .../src/app/components/app.component.tns.html | 13 -- electron/src/app/components/app.component.ts | 27 --- electron/src/app/components/app.routes.ts | 8 - .../app/components/home/home.component.html | 23 --- .../app/components/home/home.component.scss | 34 ---- .../components/home/home.component.spec.ts | 84 --------- .../components/home/home.component.tns.html | 24 --- .../components/home/home.component.tns.scss | 6 - .../src/app/components/home/home.component.ts | 48 ----- .../src/app/components/home/home.routes.ts | 8 - electron/src/app/components/index.ts | 13 -- electron/src/app/components/operators.ts | 11 -- .../app/shared/analytics/analytics.module.ts | 31 ---- electron/src/app/shared/analytics/index.ts | 9 - .../services/analytics.service.spec.ts | 95 ---------- .../analytics/services/analytics.service.ts | 95 ---------- electron/src/app/shared/core/core.module.ts | 55 ------ .../src/app/shared/core/directives/index.ts | 8 - .../directives/platform.directive.spec.ts | 44 ----- .../core/directives/platform.directive.ts | 22 --- electron/src/app/shared/core/index.ts | 12 -- .../app/shared/core/interfaces/iconsole.ts | 8 - .../src/app/shared/core/interfaces/ilang.ts | 5 - .../src/app/shared/core/interfaces/index.ts | 3 - .../src/app/shared/core/interfaces/iwindow.ts | 7 - .../app/shared/core/services/app.service.ts | 13 -- .../shared/core/services/console.service.ts | 16 -- .../src/app/shared/core/services/index.ts | 20 --- .../shared/core/services/log.service.spec.ts | 125 ------------- .../app/shared/core/services/log.service.ts | 42 ----- .../services/router-extensions.service.ts | 41 ----- .../shared/core/services/window.service.ts | 15 -- electron/src/app/shared/core/testing/index.ts | 9 - .../testing/mocks/mock-location-strategy.ts | 77 -------- .../core/testing/mocks/ng2-config.mock.ts | 30 ---- .../testing/mocks/router-extensions.mock.ts | 21 --- .../shared/core/testing/mocks/window.mock.ts | 27 --- .../app/shared/core/testing/providers/core.ts | 25 --- .../app/shared/core/testing/providers/http.ts | 39 ---- .../shared/core/testing/providers/router.ts | 12 -- .../src/app/shared/core/utils/config.spec.ts | 38 ---- electron/src/app/shared/core/utils/config.ts | 78 -------- electron/src/app/shared/core/utils/index.ts | 3 - electron/src/app/shared/core/utils/type.ts | 20 --- .../app/shared/core/utils/view-broker.spec.ts | 28 --- .../src/app/shared/core/utils/view-broker.ts | 27 --- electron/src/app/shared/electron/index.ts | 5 - .../shared/electron/services/event.service.ts | 14 -- .../electron/utils/desktop-config.spec.ts | 16 -- .../shared/electron/utils/desktop-config.ts | 14 -- electron/src/app/shared/i18n/actions/index.ts | 1 - .../i18n/actions/multilingual.action.ts | 62 ------- .../app/shared/i18n/common/category.common.ts | 1 - electron/src/app/shared/i18n/common/index.ts | 1 - .../src/app/shared/i18n/components/index.ts | 1 - .../components/lang-switcher.component.html | 5 - .../components/lang-switcher.component.scss | 0 .../lang-switcher.component.spec.ts | 91 ---------- .../lang-switcher.component.tns.html | 3 - .../lang-switcher.component.tns.ios.scss | 10 -- .../lang-switcher.component.tns.scss | 10 -- .../components/lang-switcher.component.ts | 50 ------ electron/src/app/shared/i18n/effects/index.ts | 1 - .../i18n/effects/multilingual.effect.ts | 39 ---- electron/src/app/shared/i18n/index.ts | 17 -- .../app/shared/i18n/multilingual.module.ts | 71 -------- .../src/app/shared/i18n/reducers/index.ts | 1 - .../i18n/reducers/multilingual.reducer.ts | 20 --- .../shared/i18n/services/i18n.providers.ts | 31 ---- .../src/app/shared/i18n/services/index.ts | 1 - .../services/multilingual.service.spec.ts | 92 ---------- .../i18n/services/multilingual.service.ts | 52 ------ electron/src/app/shared/i18n/states/index.ts | 1 - .../shared/i18n/states/multilingual.state.ts | 13 -- electron/src/app/shared/i18n/testing/index.ts | 27 --- .../mocks/ng2-config-multilang.mock.ts | 31 ---- .../mocks/ng2-translate-loader.mock.ts | 3 - .../i18n/testing/mocks/ng2-translate.mock.ts | 31 ---- electron/src/app/shared/ngrx/index.ts | 2 - .../src/app/shared/ngrx/state/app.state.ts | 85 --------- .../src/app/shared/sample/actions/index.ts | 1 - .../shared/sample/actions/name-list.action.ts | 73 -------- .../shared/sample/common/category.common.ts | 1 - .../src/app/shared/sample/common/index.ts | 1 - .../src/app/shared/sample/components/index.ts | 10 -- .../sample/components/navbar.component.css | 23 --- .../sample/components/navbar.component.html | 5 - .../components/navbar.component.tns.css | 12 -- .../components/navbar.component.tns.html | 4 - .../sample/components/navbar.component.ts | 13 -- .../sample/components/toolbar.component.css | 40 ----- .../sample/components/toolbar.component.html | 3 - .../components/toolbar.component.tns.css | 6 - .../components/toolbar.component.tns.html | 9 - .../sample/components/toolbar.component.ts | 21 --- .../src/app/shared/sample/effects/index.ts | 1 - .../shared/sample/effects/name-list.effect.ts | 45 ----- electron/src/app/shared/sample/index.ts | 17 -- .../src/app/shared/sample/reducers/index.ts | 1 - .../sample/reducers/name-list.reducer.ts | 22 --- .../src/app/shared/sample/sample.module.ts | 47 ----- .../shared/sample/services/app-config.spec.ts | 16 -- .../app/shared/sample/services/app-config.ts | 14 -- .../src/app/shared/sample/services/index.ts | 7 - .../sample/services/name-list.service.spec.ts | 81 --------- .../sample/services/name-list.service.ts | 34 ---- .../src/app/shared/sample/states/index.ts | 1 - .../shared/sample/states/name-list.state.ts | 13 -- electron/src/assets/data.json | 6 + electron/src/assets/favicon/favicon-DEV.ico | Bin 0 -> 1150 bytes electron/src/assets/favicon/favicon-PROD.ico | Bin 0 -> 1118 bytes electron/src/assets/i18n/bg.json | 11 ++ electron/src/assets/i18n/en.json | 11 ++ electron/src/assets/i18n/es.json | 11 ++ electron/src/assets/i18n/fr.json | 11 ++ electron/src/assets/i18n/ru.json | 11 ++ electron/src/assets/logo.icns | Bin 0 -> 121052 bytes electron/src/assets/logo.ico | Bin 0 -> 370070 bytes electron/src/assets/svg/more.svg | 7 + electron/src/assets/svg/smile.svg | 170 ++++++++++++++++++ .../Android/drawable-hdpi/icon.png | Bin .../Android/drawable-ldpi/icon.png | Bin .../Android/drawable-mdpi/icon.png | Bin .../AppIcon.appiconset/icon-50.png | Bin .../AppIcon.appiconset/icon-50@2x.png | Bin .../AppIcon.appiconset/icon-57.png | Bin .../AppIcon.appiconset/icon-57@2x.png | Bin .../AppIcon.appiconset/icon-72.png | Bin .../AppIcon.appiconset/icon-72@2x.png | Bin .../app/components/about/about.component.html | 0 src/client/app/components/app.component.html | 0 .../app/components/home/home.component.html | 0 .../app/components/home/home.component.scss | 0 tools/tasks/seed/build.assets.elec.ts | 11 +- 143 files changed, 239 insertions(+), 2976 deletions(-) delete mode 100644 electron/src/app/components/about/about.component.html delete mode 100644 electron/src/app/components/about/about.component.scss delete mode 100644 electron/src/app/components/about/about.component.spec.ts delete mode 100644 electron/src/app/components/about/about.component.tns.html delete mode 100644 electron/src/app/components/about/about.component.tns.scss delete mode 100644 electron/src/app/components/about/about.component.ts delete mode 100644 electron/src/app/components/about/about.routes.ts delete mode 100644 electron/src/app/components/app.component.html delete mode 100644 electron/src/app/components/app.component.spec.ts delete mode 100644 electron/src/app/components/app.component.tns.html delete mode 100644 electron/src/app/components/app.component.ts delete mode 100644 electron/src/app/components/app.routes.ts delete mode 100644 electron/src/app/components/home/home.component.html delete mode 100644 electron/src/app/components/home/home.component.scss delete mode 100644 electron/src/app/components/home/home.component.spec.ts delete mode 100644 electron/src/app/components/home/home.component.tns.html delete mode 100644 electron/src/app/components/home/home.component.tns.scss delete mode 100644 electron/src/app/components/home/home.component.ts delete mode 100644 electron/src/app/components/home/home.routes.ts delete mode 100644 electron/src/app/components/index.ts delete mode 100644 electron/src/app/components/operators.ts delete mode 100644 electron/src/app/shared/analytics/analytics.module.ts delete mode 100644 electron/src/app/shared/analytics/index.ts delete mode 100644 electron/src/app/shared/analytics/services/analytics.service.spec.ts delete mode 100644 electron/src/app/shared/analytics/services/analytics.service.ts delete mode 100644 electron/src/app/shared/core/core.module.ts delete mode 100644 electron/src/app/shared/core/directives/index.ts delete mode 100644 electron/src/app/shared/core/directives/platform.directive.spec.ts delete mode 100644 electron/src/app/shared/core/directives/platform.directive.ts delete mode 100644 electron/src/app/shared/core/index.ts delete mode 100644 electron/src/app/shared/core/interfaces/iconsole.ts delete mode 100644 electron/src/app/shared/core/interfaces/ilang.ts delete mode 100644 electron/src/app/shared/core/interfaces/index.ts delete mode 100644 electron/src/app/shared/core/interfaces/iwindow.ts delete mode 100644 electron/src/app/shared/core/services/app.service.ts delete mode 100644 electron/src/app/shared/core/services/console.service.ts delete mode 100644 electron/src/app/shared/core/services/index.ts delete mode 100644 electron/src/app/shared/core/services/log.service.spec.ts delete mode 100644 electron/src/app/shared/core/services/log.service.ts delete mode 100644 electron/src/app/shared/core/services/router-extensions.service.ts delete mode 100644 electron/src/app/shared/core/services/window.service.ts delete mode 100644 electron/src/app/shared/core/testing/index.ts delete mode 100644 electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts delete mode 100644 electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts delete mode 100644 electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts delete mode 100644 electron/src/app/shared/core/testing/mocks/window.mock.ts delete mode 100644 electron/src/app/shared/core/testing/providers/core.ts delete mode 100644 electron/src/app/shared/core/testing/providers/http.ts delete mode 100644 electron/src/app/shared/core/testing/providers/router.ts delete mode 100644 electron/src/app/shared/core/utils/config.spec.ts delete mode 100644 electron/src/app/shared/core/utils/config.ts delete mode 100644 electron/src/app/shared/core/utils/index.ts delete mode 100644 electron/src/app/shared/core/utils/type.ts delete mode 100644 electron/src/app/shared/core/utils/view-broker.spec.ts delete mode 100644 electron/src/app/shared/core/utils/view-broker.ts delete mode 100644 electron/src/app/shared/electron/index.ts delete mode 100644 electron/src/app/shared/electron/services/event.service.ts delete mode 100644 electron/src/app/shared/electron/utils/desktop-config.spec.ts delete mode 100644 electron/src/app/shared/electron/utils/desktop-config.ts delete mode 100644 electron/src/app/shared/i18n/actions/index.ts delete mode 100644 electron/src/app/shared/i18n/actions/multilingual.action.ts delete mode 100644 electron/src/app/shared/i18n/common/category.common.ts delete mode 100644 electron/src/app/shared/i18n/common/index.ts delete mode 100644 electron/src/app/shared/i18n/components/index.ts delete mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.html delete mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.scss delete mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts delete mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.tns.html delete mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss delete mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss delete mode 100644 electron/src/app/shared/i18n/components/lang-switcher.component.ts delete mode 100644 electron/src/app/shared/i18n/effects/index.ts delete mode 100644 electron/src/app/shared/i18n/effects/multilingual.effect.ts delete mode 100644 electron/src/app/shared/i18n/index.ts delete mode 100644 electron/src/app/shared/i18n/multilingual.module.ts delete mode 100644 electron/src/app/shared/i18n/reducers/index.ts delete mode 100644 electron/src/app/shared/i18n/reducers/multilingual.reducer.ts delete mode 100644 electron/src/app/shared/i18n/services/i18n.providers.ts delete mode 100644 electron/src/app/shared/i18n/services/index.ts delete mode 100644 electron/src/app/shared/i18n/services/multilingual.service.spec.ts delete mode 100644 electron/src/app/shared/i18n/services/multilingual.service.ts delete mode 100644 electron/src/app/shared/i18n/states/index.ts delete mode 100644 electron/src/app/shared/i18n/states/multilingual.state.ts delete mode 100644 electron/src/app/shared/i18n/testing/index.ts delete mode 100644 electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts delete mode 100644 electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts delete mode 100644 electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts delete mode 100644 electron/src/app/shared/ngrx/index.ts delete mode 100644 electron/src/app/shared/ngrx/state/app.state.ts delete mode 100644 electron/src/app/shared/sample/actions/index.ts delete mode 100644 electron/src/app/shared/sample/actions/name-list.action.ts delete mode 100644 electron/src/app/shared/sample/common/category.common.ts delete mode 100644 electron/src/app/shared/sample/common/index.ts delete mode 100644 electron/src/app/shared/sample/components/index.ts delete mode 100644 electron/src/app/shared/sample/components/navbar.component.css delete mode 100644 electron/src/app/shared/sample/components/navbar.component.html delete mode 100644 electron/src/app/shared/sample/components/navbar.component.tns.css delete mode 100644 electron/src/app/shared/sample/components/navbar.component.tns.html delete mode 100644 electron/src/app/shared/sample/components/navbar.component.ts delete mode 100644 electron/src/app/shared/sample/components/toolbar.component.css delete mode 100644 electron/src/app/shared/sample/components/toolbar.component.html delete mode 100644 electron/src/app/shared/sample/components/toolbar.component.tns.css delete mode 100644 electron/src/app/shared/sample/components/toolbar.component.tns.html delete mode 100644 electron/src/app/shared/sample/components/toolbar.component.ts delete mode 100644 electron/src/app/shared/sample/effects/index.ts delete mode 100644 electron/src/app/shared/sample/effects/name-list.effect.ts delete mode 100644 electron/src/app/shared/sample/index.ts delete mode 100644 electron/src/app/shared/sample/reducers/index.ts delete mode 100644 electron/src/app/shared/sample/reducers/name-list.reducer.ts delete mode 100644 electron/src/app/shared/sample/sample.module.ts delete mode 100644 electron/src/app/shared/sample/services/app-config.spec.ts delete mode 100644 electron/src/app/shared/sample/services/app-config.ts delete mode 100644 electron/src/app/shared/sample/services/index.ts delete mode 100644 electron/src/app/shared/sample/services/name-list.service.spec.ts delete mode 100644 electron/src/app/shared/sample/services/name-list.service.ts delete mode 100644 electron/src/app/shared/sample/states/index.ts delete mode 100644 electron/src/app/shared/sample/states/name-list.state.ts create mode 100644 electron/src/assets/data.json create mode 100644 electron/src/assets/favicon/favicon-DEV.ico create mode 100644 electron/src/assets/favicon/favicon-PROD.ico create mode 100644 electron/src/assets/i18n/bg.json create mode 100644 electron/src/assets/i18n/en.json create mode 100644 electron/src/assets/i18n/es.json create mode 100644 electron/src/assets/i18n/fr.json create mode 100644 electron/src/assets/i18n/ru.json create mode 100644 electron/src/assets/logo.icns create mode 100644 electron/src/assets/logo.ico create mode 100644 electron/src/assets/svg/more.svg create mode 100644 electron/src/assets/svg/smile.svg mode change 100755 => 100644 nativescript/src/App_Resources/Android/drawable-hdpi/icon.png mode change 100755 => 100644 nativescript/src/App_Resources/Android/drawable-ldpi/icon.png mode change 100755 => 100644 nativescript/src/App_Resources/Android/drawable-mdpi/icon.png mode change 100755 => 100644 nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50.png mode change 100755 => 100644 nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png mode change 100755 => 100644 nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57.png mode change 100755 => 100644 nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57@2x.png mode change 100755 => 100644 nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72.png mode change 100755 => 100644 nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png mode change 100755 => 100644 src/client/app/components/about/about.component.html mode change 100755 => 100644 src/client/app/components/app.component.html mode change 100755 => 100644 src/client/app/components/home/home.component.html mode change 100755 => 100644 src/client/app/components/home/home.component.scss diff --git a/electron/src/app/components/about/about.component.html b/electron/src/app/components/about/about.component.html deleted file mode 100644 index 071ed6414..000000000 --- a/electron/src/app/components/about/about.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
-

- Angular Seed Advanced is a starter project that implements best practices in coding, building and testing Angular 2 apps. - Additionally it adds various enhancements and integrations for large global projects. -

- -

Features

-
    -
  • Ready to go, statically typed build system using Gulp for working with TypeScript.
  • -
  • Production and development builds.
  • -
  • Sample unit tests with Jasmine and Karma including code coverage via Istanbul.
  • -
  • End-to-end tests with Protractor.
  • -
  • Development server with live reload.
  • -
  • TypeScript definition management using Typings.
  • -
  • Basic Service Worker, which implements "Cache then network strategy".
  • -
  • Integration with lodash.
  • -
  • RxJS powered state management (Redux) via ngrx/store.
  • -
  • i18n with ng2-translate.
  • -
  • Native cross platform app development with NativeScript.
  • -
-
diff --git a/electron/src/app/components/about/about.component.scss b/electron/src/app/components/about/about.component.scss deleted file mode 100644 index 47835c1b8..000000000 --- a/electron/src/app/components/about/about.component.scss +++ /dev/null @@ -1,20 +0,0 @@ -:host { - display: block; - padding: 0 16px; -} - -.feature-list .body { - font-size: 16; - color: #555; - margin: 0 0 5 0; -} - -.h1 { - color: #106cc8; - font-size: 24; -} - -.h4 { - color: #999; - font-size: 18; -} diff --git a/electron/src/app/components/about/about.component.spec.ts b/electron/src/app/components/about/about.component.spec.ts deleted file mode 100644 index 68555311d..000000000 --- a/electron/src/app/components/about/about.component.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -// angular -import { Component } from '@angular/core'; -import { TestBed } from '@angular/core/testing'; - -// app -import { t } from '../../shared/test/index'; -import { AboutComponent } from './about.component'; - -// test module configuration for each test -const testModuleConfig = () => { - TestBed.configureTestingModule({ - declarations: [AboutComponent, TestComponent] - }); -}; - -export function main() { - t.describe('@Component: AboutComponent', () => { - - t.be(testModuleConfig); - - t.it('should work', - t.async(() => { - TestBed.compileComponents() - .then(() => { - let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - let aboutDOMEl = fixture.debugElement.children[0].nativeElement; - - t.e(aboutDOMEl.querySelectorAll('h2')[0].textContent).toEqual('Features'); - }); - })); - }); -} - -@Component({ - selector: 'test-cmp', - template: '' -}) -class TestComponent { } diff --git a/electron/src/app/components/about/about.component.tns.html b/electron/src/app/components/about/about.component.tns.html deleted file mode 100644 index b0aa979f9..000000000 --- a/electron/src/app/components/about/about.component.tns.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/electron/src/app/components/about/about.component.tns.scss b/electron/src/app/components/about/about.component.tns.scss deleted file mode 100644 index 43f0a5a47..000000000 --- a/electron/src/app/components/about/about.component.tns.scss +++ /dev/null @@ -1,15 +0,0 @@ -.feature-list .body { - font-size: 16; - color: #555; - margin: 0 0 5 0; -} - -.h1 { - color: #106cc8; - font-size: 24; -} - -.h4 { - color: #999; - font-size: 18; -} diff --git a/electron/src/app/components/about/about.component.ts b/electron/src/app/components/about/about.component.ts deleted file mode 100644 index a0991104c..000000000 --- a/electron/src/app/components/about/about.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injector, Component } from '@angular/core'; -import { Config } from '../../shared/core/index'; - -@Component({ - moduleId: module.id, - selector: 'sd-about', - templateUrl: 'about.component.html', - styleUrls: [ - 'about.component.css', - ], -}) -export class AboutComponent { - - // Just one way you could handle the {N} `ui/page` Page class - // in a shared component... - private _page: any; - private get page() { - if (Config.PageClass) { - if (!this._page) { - this._page = this.injector.get(Config.PageClass); - } - - return this._page; - } - } - - constructor(private injector: Injector) { - // This is here as an example - // if (this.page) { - // this.page.actionBarHidden = true; - // } - } -} diff --git a/electron/src/app/components/about/about.routes.ts b/electron/src/app/components/about/about.routes.ts deleted file mode 100644 index e63de16de..000000000 --- a/electron/src/app/components/about/about.routes.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AboutComponent } from './about.component'; - -export const AboutRoutes: Array = [ - { - path: 'about', - component: AboutComponent - } -]; diff --git a/electron/src/app/components/app.component.html b/electron/src/app/components/app.component.html deleted file mode 100644 index 95a011d12..000000000 --- a/electron/src/app/components/app.component.html +++ /dev/null @@ -1,5 +0,0 @@ -
- - - -
diff --git a/electron/src/app/components/app.component.spec.ts b/electron/src/app/components/app.component.spec.ts deleted file mode 100644 index e2fd45c60..000000000 --- a/electron/src/app/components/app.component.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -// angular -import { TestBed } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { Route } from '@angular/router'; -import { RouterTestingModule } from '@angular/router/testing'; - -// libs -import { StoreModule } from '@ngrx/store'; -import { Angulartics2Module } from 'angulartics2'; -import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; - -// app -import { t } from '../shared/test/index'; -import { TEST_CORE_PROVIDERS, TEST_HTTP_PROVIDERS } from '../shared/core/testing/index'; -import { NameListService, NavbarComponent, ToolbarComponent } from '../shared/sample/index'; -import { MultilingualModule } from '../shared/i18n/multilingual.module'; -import { reducer } from '../shared/i18n/index'; - -// module -import { AppComponent } from './app.component'; -import { HomeComponent } from './home/home.component'; -import { AboutComponent } from './about/about.component'; - -const config:Route[] = [ - {path: '', component: HomeComponent}, - {path: 'about', component: AboutComponent} -]; - -// test module configuration for each test -const testModuleConfig = () => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - Angulartics2Module.forRoot([ - Angulartics2Segment - ]), - MultilingualModule, - StoreModule.provideStore({ }), - RouterTestingModule.withRoutes(config) - ], - declarations: [ - TestComponent, AppComponent, - HomeComponent, AboutComponent, - NavbarComponent, ToolbarComponent - ], - providers: [ - TEST_CORE_PROVIDERS(), - TEST_HTTP_PROVIDERS(), - NameListService - ] - }); -}; - -export function main() { - t.describe('@Component: AppComponent', () => { - - t.be(testModuleConfig); - - t.it('should build without a problem', - t.async(() => { - TestBed.compileComponents() - .then(() => { - let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - t.e(fixture.nativeElement).toBeTruthy(); - }); - })); - }); -} - -@Component({ - selector: 'test-cmp', - template: '' -}) -class TestComponent {} diff --git a/electron/src/app/components/app.component.tns.html b/electron/src/app/components/app.component.tns.html deleted file mode 100644 index 21e585e7d..000000000 --- a/electron/src/app/components/app.component.tns.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/electron/src/app/components/app.component.ts b/electron/src/app/components/app.component.ts deleted file mode 100644 index 302051c69..000000000 --- a/electron/src/app/components/app.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -// any operators needed throughout your application -import './operators'; - -// libs -import { Component, OnInit } from '@angular/core'; - -// app -import { AnalyticsService } from '../shared/analytics/index'; -import { Config, LogService, AppService } from '../shared/core/index'; - -/** - * This class represents the main application component. - */ -@Component({ - moduleId: module.id, - selector: 'sd-app', - templateUrl: 'app.component.html' -}) -export class AppComponent { - constructor( - public analytics: AnalyticsService, - public log: LogService, - private appService: AppService - ) { - log.debug(`Config env: ${Config.ENVIRONMENT().ENV}`); - } -} diff --git a/electron/src/app/components/app.routes.ts b/electron/src/app/components/app.routes.ts deleted file mode 100644 index 0aad2d95c..000000000 --- a/electron/src/app/components/app.routes.ts +++ /dev/null @@ -1,8 +0,0 @@ -// app -import { HomeRoutes } from './home/home.routes'; -import { AboutRoutes } from './about/about.routes'; - -export const routes: Array = [ - ...HomeRoutes, - ...AboutRoutes -]; diff --git a/electron/src/app/components/home/home.component.html b/electron/src/app/components/home/home.component.html deleted file mode 100644 index 1bf66de6d..000000000 --- a/electron/src/app/components/home/home.component.html +++ /dev/null @@ -1,23 +0,0 @@ -

- {{ 'LOVE_TECH' | translate }}
-

- -

- {{'ABOUT_REWARD' | translate}} -

-

- {{'ABOUT_ADD' | translate}} -

- -
- - -
- -
    -
  • {{name}}
  • -
- -

- About - RouterExtensions example -

diff --git a/electron/src/app/components/home/home.component.scss b/electron/src/app/components/home/home.component.scss deleted file mode 100644 index d8addab91..000000000 --- a/electron/src/app/components/home/home.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -:host { - display: block; - padding: 0 16px; -} - -input { - width: 250px; -} - -ul { - list-style-type: none; - padding: 0 0 0 8px; -} - -.smile { - background: url("./assets/svg/smile.svg"); - height: 48px; - width: 48px; - display: inline-block; - transform: scale(0.6); - margin-top: -25px; - position: relative; - top: 16px; -} - -a.link { - color: #00e; - cursor: pointer; - text-decoration: underline; -} - -a.link:hover { - color: #f00; -} diff --git a/electron/src/app/components/home/home.component.spec.ts b/electron/src/app/components/home/home.component.spec.ts deleted file mode 100644 index 0eb478d49..000000000 --- a/electron/src/app/components/home/home.component.spec.ts +++ /dev/null @@ -1,84 +0,0 @@ -// angular -import { Component } from '@angular/core'; -import { TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { - BaseRequestOptions, - ConnectionBackend, - Http -} from '@angular/http'; -import { MockBackend } from '@angular/http/testing'; - -// libs -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { t } from '../../shared/test/index'; -import { NameListService, NameListEffects, reducer } from '../../shared/sample/index'; -import { CoreModule } from '../../shared/core/core.module'; -import { AnalyticsModule } from '../../shared/analytics/analytics.module'; -import { MultilingualModule } from '../../shared/i18n/multilingual.module'; -import { HomeComponent } from './home.component'; - -// test module configuration for each test -const testModuleConfig = () => { - TestBed.configureTestingModule({ - imports: [ - CoreModule, - RouterTestingModule, - AnalyticsModule, - MultilingualModule, - StoreModule.provideStore({ sample: reducer }), - EffectsModule.run(NameListEffects) - ], - declarations: [HomeComponent, TestComponent], - providers: [ - NameListService, - BaseRequestOptions, - MockBackend, - { - provide: Http, useFactory: function (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) { - return new Http(backend, defaultOptions); - }, - deps: [MockBackend, BaseRequestOptions] - } - ] - }); -}; - -export function main() { - t.describe('@Component: HomeComponent', () => { - - t.be(testModuleConfig); - - t.it('should work', - t.async(() => { - TestBed.compileComponents() - .then(() => { - let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - - let homeInstance = fixture.debugElement.children[0].componentInstance; - let homeDOMEl = fixture.debugElement.children[0].nativeElement; - - t.e(homeDOMEl.querySelectorAll('li').length).toEqual(0); - - homeInstance.newName = 'Minko'; - homeInstance.addName(); - - fixture.detectChanges(); - - t.e(homeDOMEl.querySelectorAll('li').length).toEqual(1); - t.e(homeDOMEl.querySelectorAll('li')[0].textContent).toEqual('Minko'); - }); - })); - }); -} - -@Component({ - selector: 'test-cmp', - template: '' -}) -class TestComponent { - -} diff --git a/electron/src/app/components/home/home.component.tns.html b/electron/src/app/components/home/home.component.tns.html deleted file mode 100644 index 33419b063..000000000 --- a/electron/src/app/components/home/home.component.tns.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/electron/src/app/components/home/home.component.tns.scss b/electron/src/app/components/home/home.component.tns.scss deleted file mode 100644 index 2fcaaa107..000000000 --- a/electron/src/app/components/home/home.component.tns.scss +++ /dev/null @@ -1,6 +0,0 @@ -.love-tech { - font-size: 28; - font-weight: bold; - color: purple; - margin: 8 0 8 0; -} diff --git a/electron/src/app/components/home/home.component.ts b/electron/src/app/components/home/home.component.ts deleted file mode 100644 index 04c8d5878..000000000 --- a/electron/src/app/components/home/home.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -// libs -import { Component, ElementRef, ViewChild, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs/Observable'; - -// app -import { RouterExtensions, Config } from '../../shared/core/index'; -import { IAppState, getNames } from '../../shared/ngrx/index'; -import * as nameList from '../../shared/sample/index'; - -@Component({ - moduleId: module.id, - selector: 'sd-home', - templateUrl: 'home.component.html', - styleUrls: ['home.component.css'] -}) -export class HomeComponent implements OnInit { - public names$: Observable; - public newName: string; - - constructor(private store: Store, public routerext: RouterExtensions) {} - - ngOnInit() { - this.names$ = this.store.let(getNames); - this.newName = ''; - } - - /* - * @param newname any text as input. - * @returns return false to prevent default form submit behavior to refresh the page. - */ - addName(): boolean { - this.store.dispatch(new nameList.AddAction(this.newName)); - this.newName = ''; - return false; - } - - readAbout() { - // Try this in the {N} app - // {N} can use these animation options - this.routerext.navigate(['/about'], { - transition: { - duration: 1000, - name: 'slideTop', - } - }); - } -} diff --git a/electron/src/app/components/home/home.routes.ts b/electron/src/app/components/home/home.routes.ts deleted file mode 100644 index 08c0ea203..000000000 --- a/electron/src/app/components/home/home.routes.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { HomeComponent } from './home.component'; - -export const HomeRoutes: Array = [ - { - path: '', - component: HomeComponent - } -]; diff --git a/electron/src/app/components/index.ts b/electron/src/app/components/index.ts deleted file mode 100644 index 6d2866641..000000000 --- a/electron/src/app/components/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppComponent } from './app.component'; -import { AboutComponent } from './about/about.component'; -import { HomeComponent } from './home/home.component'; - -export const APP_COMPONENTS: any[] = [ - AppComponent, - AboutComponent, - HomeComponent -]; - -export * from './app.component'; -export * from './about/about.component'; -export * from './home/home.component'; diff --git a/electron/src/app/components/operators.ts b/electron/src/app/components/operators.ts deleted file mode 100644 index 16bc34aaa..000000000 --- a/electron/src/app/components/operators.ts +++ /dev/null @@ -1,11 +0,0 @@ -// rxjs -import 'rxjs/add/observable/throw'; -import 'rxjs/add/operator/map'; -import 'rxjs/add/operator/startWith'; -import 'rxjs/add/operator/switchMap'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/take'; -import 'rxjs/add/operator/let'; - -// ngrx -import '@ngrx/core/add/operator/select'; diff --git a/electron/src/app/shared/analytics/analytics.module.ts b/electron/src/app/shared/analytics/analytics.module.ts deleted file mode 100644 index 1bc0d9325..000000000 --- a/electron/src/app/shared/analytics/analytics.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -// angular -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { HttpModule } from '@angular/http'; - -// lib -import { Angulartics2Module } from 'angulartics2'; -import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; - -// module -import { ANALYTICS_PROVIDERS } from './index'; - -/** - * Do not specify providers for modules that might be imported by a lazy loaded module. - */ - -@NgModule({ - imports: [ - CommonModule, - RouterModule, - HttpModule, - Angulartics2Module.forRoot([ - Angulartics2Segment - ]) - ], - providers: ANALYTICS_PROVIDERS -}) -export class AnalyticsModule { - -} diff --git a/electron/src/app/shared/analytics/index.ts b/electron/src/app/shared/analytics/index.ts deleted file mode 100644 index 670d1bdf5..000000000 --- a/electron/src/app/shared/analytics/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -// app -import { AnalyticsService } from './services/analytics.service'; - -export const ANALYTICS_PROVIDERS: Array = [ - AnalyticsService -]; - -// services -export * from './services/analytics.service'; diff --git a/electron/src/app/shared/analytics/services/analytics.service.spec.ts b/electron/src/app/shared/analytics/services/analytics.service.spec.ts deleted file mode 100644 index cc2dc47d1..000000000 --- a/electron/src/app/shared/analytics/services/analytics.service.spec.ts +++ /dev/null @@ -1,95 +0,0 @@ -// angular -import { TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -// libs -import { Angulartics2Module } from 'angulartics2'; -import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; - -// app -import { t } from '../../test/index'; - -// module -import { AnalyticsService, Analytics } from '../index'; - -const testModuleConfig = () => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - Angulartics2Module.forRoot([ - Angulartics2Segment - ]) - ], - providers: [ - AnalyticsService - ] - }); -}; - -export function main() { - t.describe('analytics:', () => { - - t.be(testModuleConfig); - - t.describe('AnalyticsService', () => { - - t.describe('api works', () => { - t.it('track', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { - analyticsService.devMode(false); - t.spyOn(segment, 'eventTrack'); - analyticsService.track('click', { category: 'TEST', label: 'Testing' }); - t.e(segment.eventTrack).toHaveBeenCalledWith('click', { category: 'TEST', label: 'Testing' }); - })); - t.it('track devMode: ON', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { - t.spyOn(segment, 'eventTrack'); - - // dev mode: shouldn't track anything - analyticsService.devMode(true); - analyticsService.track('click', { category: 'TEST', label: 'Testing' }); - t.e(segment.eventTrack).not.toHaveBeenCalled(); - })); - t.it('pageTrack', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { - t.spyOn(segment, 'pageTrack'); - analyticsService.pageTrack('/testing', { }); - t.e(segment.pageTrack).toHaveBeenCalledWith('/testing', {}); - })); - t.it('pageTrack devMode: ON', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { - t.spyOn(segment, 'pageTrack'); - - // dev mode: shouldn't track anything - analyticsService.devMode(true); - analyticsService.pageTrack('/testing', { }); - t.e(segment.pageTrack).not.toHaveBeenCalled(); - })); - t.it('identify', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { - t.spyOn(segment, 'setUserProperties'); - analyticsService.identify({ userId: 1, name: 'Test', email: 'name@domain.com' }); - t.e(segment.setUserProperties).toHaveBeenCalledWith({ userId: 1, name: 'Test', email: 'name@domain.com' }); - })); - t.it('identify devMode: ON', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { - t.spyOn(segment, 'setUserProperties'); - - // dev mode: shouldn't track anything - analyticsService.devMode(true); - analyticsService.identify({ userId: 1, name: 'Test', email: 'name@domain.com' }); - t.e(segment.setUserProperties).not.toHaveBeenCalled(); - })); - }); - }); - - t.describe('Analytics (Base Class)', () => { - - t.describe('should allow descendants to track actions', () => { - t.it('track', t.inject([AnalyticsService, Angulartics2Segment], (analyticsService:any, segment:any) => { - t.spyOn(analyticsService, 'track'); - let analytics = new TestAnalytics(analyticsService); - analytics.category = 'TEST'; - analytics.track('action', { category: analytics.category, label: 'Testing' }); - t.e(analyticsService.track).toHaveBeenCalledWith('action', { category: analytics.category, label: 'Testing' }); - })); - }); - }); - }); -} - -class TestAnalytics extends Analytics { } diff --git a/electron/src/app/shared/analytics/services/analytics.service.ts b/electron/src/app/shared/analytics/services/analytics.service.ts deleted file mode 100644 index 6cf84dedf..000000000 --- a/electron/src/app/shared/analytics/services/analytics.service.ts +++ /dev/null @@ -1,95 +0,0 @@ -// angular -import { Injectable, Inject } from '@angular/core'; - -// libs -import * as _ from 'lodash'; -import { Angulartics2 } from 'angulartics2'; -import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; - -export interface IAnalyticsProperties { - category?: string; - label?: string; - value?: number; -} - -export interface IAnalytics { - track(action: string, properties: IAnalyticsProperties): void; -} - -/** - * Wrapper for Angulartics2 - */ -@Injectable() -export class AnalyticsService implements IAnalytics { - - constructor(private angulartics2: Angulartics2, private segment: Angulartics2Segment) { - // options - // https://github.com/angulartics/angulartics2/blob/master/src/core/angulartics2.ts#L90-L104 - // angulartics2.virtualPageviews(value: boolean); - // angulartics2.excludeRoutes(routes: Array); - // angulartics2.firstPageview(value: boolean); - // angulartics2.withBase(value: string); - - this.devMode(false); - } - - /** - * Track actions, events, etc. - **/ - public track(action: string, properties: IAnalyticsProperties): void { - if (!this.devMode()) { - this.segment.eventTrack(action, properties); - } - } - - /** - * Called automatically by default with Angular 2 Routing - * However, that can be turned off and this could be used manually - **/ - public pageTrack(path: string, location: any) { - if (!this.devMode()) { - this.segment.pageTrack(path, location); - } - } - - /** - * Identify authenticated users - **/ - public identify(properties: any) { - if (!this.devMode()) { - this.segment.setUserProperties(properties); - } - } - - /** - * Control whether analytics are tracked - * true: dev mode on, therefore do not track anything - * false: dev mode off, track everything - **/ - public devMode(enable?: boolean): boolean { - if (typeof enable !== 'undefined') { - this.angulartics2.developerMode(enable); - } - return this.angulartics2.settings.developerMode; - } -} - -/** - * Base class - * Standardizes tracking actions and categorization - */ -export class Analytics implements IAnalytics { - // sub-classes should define their category - public category: string; - - constructor(@Inject(AnalyticsService) public analytics: AnalyticsService) { - - } - - /** - * Track actions, events, etc. - **/ - track(action: string, properties: IAnalyticsProperties): void { - this.analytics.track(action, _.extend(properties, { category: this.category })); - } -} diff --git a/electron/src/app/shared/core/core.module.ts b/electron/src/app/shared/core/core.module.ts deleted file mode 100644 index fee0e14f7..000000000 --- a/electron/src/app/shared/core/core.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -// angular -import { NgModule, ModuleWithProviders, Optional, SkipSelf } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { HttpModule } from '@angular/http'; - -// module -import { CORE_DIRECTIVES } from './directives/index'; -import { CORE_PROVIDERS } from './services/index'; -import { Config } from './utils/index'; - -interface ICoreModuleOptions { - window?: any; - console?: any; -} - -/** - * Do not specify providers for modules that might be imported by a lazy loaded module. - */ - -@NgModule({ - imports: [ - CommonModule, - RouterModule, - HttpModule - ], - declarations: [ - CORE_DIRECTIVES - ], - exports: [ - CommonModule, - FormsModule, - RouterModule, - HttpModule, - CORE_DIRECTIVES - ], - providers: [ - CORE_PROVIDERS - ] -}) -export class CoreModule { - // configuredProviders: *required to configure WindowService and ConsoleService per platform - static forRoot(configuredProviders: Array): ModuleWithProviders { - return { - ngModule: CoreModule, - providers: configuredProviders - }; - } - constructor(@Optional() @SkipSelf() parentModule: CoreModule) { - if (parentModule) { - throw new Error('CoreModule already loaded; Import in root module only.'); - } - } -} diff --git a/electron/src/app/shared/core/directives/index.ts b/electron/src/app/shared/core/directives/index.ts deleted file mode 100644 index b233a64eb..000000000 --- a/electron/src/app/shared/core/directives/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -// app -import { PlatformDirective } from './platform.directive'; - -export const CORE_DIRECTIVES: any[] = [ - PlatformDirective -]; - -export * from './platform.directive'; diff --git a/electron/src/app/shared/core/directives/platform.directive.spec.ts b/electron/src/app/shared/core/directives/platform.directive.spec.ts deleted file mode 100644 index 60e68ac55..000000000 --- a/electron/src/app/shared/core/directives/platform.directive.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -// angular -import { TestBed } from '@angular/core/testing'; -import { Component } from '@angular/core'; - -// app -import { t } from '../../test/index'; - -// module -import { PlatformDirective } from './platform.directive'; -import { WindowService } from '../../core/index'; -import { WindowMock } from '../../core/testing/index'; - -const testModuleConfig = () => { - TestBed.configureTestingModule({ - declarations: [PlatformDirective, TestComponent] - }); -}; - -@Component({ - viewProviders: [ - { provide: WindowService, useClass: WindowMock } - ], - selector: 'test-cmp', - template: `
` -}) -class TestComponent { } - -export function main() { - t.describe('core: PlatformDirective', () => { - - t.be(testModuleConfig); - - t.it('should add platform class', - t.async(() => { - TestBed.compileComponents() - .then(() => { - let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - let compDOMEl = fixture.debugElement.children[0].nativeElement; - t.e(compDOMEl.getAttribute('class')).toBe('web'); - }); - })); - }); -} diff --git a/electron/src/app/shared/core/directives/platform.directive.ts b/electron/src/app/shared/core/directives/platform.directive.ts deleted file mode 100644 index e61892d61..000000000 --- a/electron/src/app/shared/core/directives/platform.directive.ts +++ /dev/null @@ -1,22 +0,0 @@ -// angular -import { Directive, ElementRef, Renderer } from '@angular/core'; - -// module -import { WindowService } from '../services/window.service'; - -@Directive({ - selector: '[platform]' -}) -export class PlatformDirective { - - constructor(private el: ElementRef, private renderer: Renderer, private win: WindowService) { - let platformClass = 'web'; - let agent = win.navigator.userAgent.toLowerCase(); - if (agent.indexOf('electron') > -1) { - platformClass = 'desktop'; - } else if (agent.indexOf('nativescript') > -1) { - platformClass = 'nativescript'; - } - renderer.setElementClass(el.nativeElement, platformClass, true); - } -} diff --git a/electron/src/app/shared/core/index.ts b/electron/src/app/shared/core/index.ts deleted file mode 100644 index a5c496e4d..000000000 --- a/electron/src/app/shared/core/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// utilities -// generally static helpers (non-injectables) -export * from './utils/index'; - -// interfaces -export * from './interfaces/index'; - -// services -export * from './services/index'; - -// directives -export * from './directives/index'; diff --git a/electron/src/app/shared/core/interfaces/iconsole.ts b/electron/src/app/shared/core/interfaces/iconsole.ts deleted file mode 100644 index c3bd634b8..000000000 --- a/electron/src/app/shared/core/interfaces/iconsole.ts +++ /dev/null @@ -1,8 +0,0 @@ -// standard console interface -export interface IConsole { - log(m: any): void; - debug(m: any): void; - error(m: any): void; - warn(m: any): void; - info(m: any): void; -} diff --git a/electron/src/app/shared/core/interfaces/ilang.ts b/electron/src/app/shared/core/interfaces/ilang.ts deleted file mode 100644 index 968fd254e..000000000 --- a/electron/src/app/shared/core/interfaces/ilang.ts +++ /dev/null @@ -1,5 +0,0 @@ -// standard language interface -export interface ILang { - code: string; - title: string; -} diff --git a/electron/src/app/shared/core/interfaces/index.ts b/electron/src/app/shared/core/interfaces/index.ts deleted file mode 100644 index 5affce021..000000000 --- a/electron/src/app/shared/core/interfaces/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './iconsole'; -export * from './ilang'; -export * from './iwindow'; diff --git a/electron/src/app/shared/core/interfaces/iwindow.ts b/electron/src/app/shared/core/interfaces/iwindow.ts deleted file mode 100644 index 667edeb04..000000000 --- a/electron/src/app/shared/core/interfaces/iwindow.ts +++ /dev/null @@ -1,7 +0,0 @@ -// standard window interface -export interface IWindow { - navigator: any; - location: any; - alert(msg: string): void; - confirm(msg: string): void; -} diff --git a/electron/src/app/shared/core/services/app.service.ts b/electron/src/app/shared/core/services/app.service.ts deleted file mode 100644 index 17ad1a63c..000000000 --- a/electron/src/app/shared/core/services/app.service.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Injectable } from '@angular/core'; - -// app -import { AnalyticsService } from '../../../shared/analytics/index'; -import { LogService } from './log.service'; -import { Config } from '../utils/config'; - -@Injectable() -export class AppService { - constructor(public analytics: AnalyticsService, public log: LogService) { - this.log.debug(`AppService -> Config env: ${Config.ENVIRONMENT().ENV}`); - } -} diff --git a/electron/src/app/shared/core/services/console.service.ts b/electron/src/app/shared/core/services/console.service.ts deleted file mode 100644 index 127c93fa5..000000000 --- a/electron/src/app/shared/core/services/console.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; - -// module -import { IConsole } from '../interfaces/iconsole'; - -@Injectable() -export class ConsoleService implements IConsole { - - public log(m: any): void { return; } - public debug(m: any): void { return; } - public error(m: any): void { return; } - public warn(m: any): void { return; } - public info(m: any): void { return; } - -} diff --git a/electron/src/app/shared/core/services/index.ts b/electron/src/app/shared/core/services/index.ts deleted file mode 100644 index ff94ce70e..000000000 --- a/electron/src/app/shared/core/services/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -// app -import { ConsoleService } from './console.service'; -import { LogService } from './log.service'; -import { RouterExtensions } from './router-extensions.service'; -import { WindowService } from './window.service'; -import { AppService } from './app.service'; - -export const CORE_PROVIDERS: any[] = [ - AppService, - ConsoleService, - LogService, - RouterExtensions, - WindowService -]; - -export * from './app.service'; -export * from './console.service'; -export * from './log.service'; -export * from './router-extensions.service'; -export * from './window.service'; diff --git a/electron/src/app/shared/core/services/log.service.spec.ts b/electron/src/app/shared/core/services/log.service.spec.ts deleted file mode 100644 index b0fb332e3..000000000 --- a/electron/src/app/shared/core/services/log.service.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -// angular -import { TestBed } from '@angular/core/testing'; - -// app -import { t } from '../../test/index'; - -// module -import { Config, ConsoleService, LogService } from '../index'; - -const providers: Array = [ - { provide: ConsoleService, useValue: console }, - LogService -]; - -export function main() { - t.describe('core: LogService', () => { - - t.be(() => { - // ensure statics are in default state - Config.RESET(); - // spy - t.spyOn(console, 'log'); - t.spyOn(console, 'error'); - t.spyOn(console, 'warn'); - t.spyOn(console, 'info'); - - TestBed.configureTestingModule({ - providers: providers - }); - }); - - t.describe('api', () => { - - t.it('sanity', t.inject([LogService], (log: LogService) => { - t.e(log.debug).toBeDefined(); - t.e(log.error).toBeDefined(); - t.e(log.warn).toBeDefined(); - t.e(log.info).toBeDefined(); - })); - - t.it('should not log anything by default', t.inject([LogService], (log: LogService) => { - log.debug('debug'); - t.e(console.log).not.toHaveBeenCalledWith('debug'); - log.error('error'); - t.e(console.error).not.toHaveBeenCalledWith('error'); - log.warn('warn'); - t.e(console.warn).not.toHaveBeenCalledWith('warn'); - log.info('info'); - t.e(console.info).not.toHaveBeenCalledWith('info'); - })); - }); - - t.describe('debug levels', () => { - - t.be(() => { - Config.RESET(); - }); - - t.it('LEVEL_4: everything', t.inject([LogService], (log: LogService) => { - Config.DEBUG.LEVEL_4 = true; - - log.debug('debug'); - t.e(console.log).toHaveBeenCalledWith('debug'); - log.error('error'); - t.e(console.error).toHaveBeenCalledWith('error'); - log.warn('warn'); - t.e(console.warn).toHaveBeenCalledWith('warn'); - log.info('info'); - t.e(console.info).toHaveBeenCalledWith('info'); - })); - - t.it('LEVEL_3: error only', t.inject([LogService], (log: LogService) => { - Config.DEBUG.LEVEL_3 = true; - - log.debug('debug'); - t.e(console.log).not.toHaveBeenCalledWith('debug'); - log.error('error'); - t.e(console.error).toHaveBeenCalledWith('error'); - log.warn('warn'); - t.e(console.warn).not.toHaveBeenCalledWith('warn'); - log.info('info'); - t.e(console.info).not.toHaveBeenCalledWith('info'); - - // always overrides lower levels and allows them to come through - Config.DEBUG.LEVEL_4 = true; - - log.debug('debug w/level_4'); - t.e(console.log).toHaveBeenCalledWith('debug w/level_4'); - log.error('error w/level_4'); - t.e(console.error).toHaveBeenCalledWith('error w/level_4'); - log.warn('warn w/level_4'); - t.e(console.warn).toHaveBeenCalledWith('warn w/level_4'); - log.info('info w/level_4'); - t.e(console.info).toHaveBeenCalledWith('info w/level_4'); - })); - - t.it('LEVEL_2: warn only', t.inject([LogService], (log: LogService) => { - Config.DEBUG.LEVEL_2 = true; - - log.debug('debug'); - t.e(console.log).not.toHaveBeenCalledWith('debug'); - log.error('error'); - t.e(console.error).not.toHaveBeenCalledWith('error'); - log.warn('warn'); - t.e(console.warn).toHaveBeenCalledWith('warn'); - log.info('info'); - t.e(console.info).not.toHaveBeenCalledWith('info'); - })); - - t.it('LEVEL_1: info only', t.inject([LogService], (log: LogService) => { - Config.DEBUG.LEVEL_1 = true; - - log.debug('debug'); - t.e(console.log).not.toHaveBeenCalledWith('debug'); - log.error('error'); - t.e(console.error).not.toHaveBeenCalledWith('error'); - log.warn('warn'); - t.e(console.warn).not.toHaveBeenCalledWith('warn'); - log.info('info'); - t.e(console.info).toHaveBeenCalledWith('info'); - })); - }); - }); - -} diff --git a/electron/src/app/shared/core/services/log.service.ts b/electron/src/app/shared/core/services/log.service.ts deleted file mode 100644 index 63b3b96c3..000000000 --- a/electron/src/app/shared/core/services/log.service.ts +++ /dev/null @@ -1,42 +0,0 @@ -// angular -import { Injectable, Inject, forwardRef } from '@angular/core'; - -// module -import { Config } from '../utils/config'; -import { ConsoleService } from './console.service'; - -@Injectable() -export class LogService { - - constructor(@Inject(forwardRef(() => ConsoleService)) public logger: ConsoleService) {} - - // debug (standard output) - public debug(msg: any) { - if (Config.DEBUG.LEVEL_4) { - // console.debug does not work on {N} apps... use `log` - this.logger.log(msg); - } - } - - // error - public error(err: any) { - if (Config.DEBUG.LEVEL_4 || Config.DEBUG.LEVEL_3) { - this.logger.error(err); - } - } - - // warn - public warn(err: any) { - if (Config.DEBUG.LEVEL_4 || Config.DEBUG.LEVEL_2) { - this.logger.warn(err); - } - } - - // info - public info(err: any) { - if (Config.DEBUG.LEVEL_4 || Config.DEBUG.LEVEL_1) { - this.logger.info(err); - } - } - -} diff --git a/electron/src/app/shared/core/services/router-extensions.service.ts b/electron/src/app/shared/core/services/router-extensions.service.ts deleted file mode 100644 index fa865b00a..000000000 --- a/electron/src/app/shared/core/services/router-extensions.service.ts +++ /dev/null @@ -1,41 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { LocationStrategy } from '@angular/common'; -import { Router, UrlTree, NavigationExtras } from '@angular/router'; - -export interface ExtendedNavigationExtras extends NavigationExtras { - // Options for nativescript - clearHistory?: boolean; - animated?: boolean; - transition?: { // See -> https://docs.nativescript.org/api-reference/interfaces/_ui_frame_.navigationtransition.html - name?: string; - instance?: any; - duration?: number; - curve?: any; - }; - // END - Options for nativescript -} - -export interface IRouterExtensions { - navigate(commands: Array, extras?: ExtendedNavigationExtras): Promise; - navigateByUrl(url: string | UrlTree, options?: ExtendedNavigationExtras): Promise; - back(): void; -} - -@Injectable() -export class RouterExtensions implements IRouterExtensions { - - constructor(public router: Router, private locationStrategy: LocationStrategy) { } - - public navigate(commands: Array, extras?: ExtendedNavigationExtras): Promise { - return this.router.navigate(commands, extras); - } - - public navigateByUrl(url: string | UrlTree, options?: ExtendedNavigationExtras): Promise { - return this.router.navigateByUrl(url); - } - - public back() { - this.locationStrategy.back(); - } -} diff --git a/electron/src/app/shared/core/services/window.service.ts b/electron/src/app/shared/core/services/window.service.ts deleted file mode 100644 index 1d021f2a6..000000000 --- a/electron/src/app/shared/core/services/window.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; - -// module -import { IWindow } from '../interfaces/iwindow'; - -@Injectable() -export class WindowService implements IWindow { - - public navigator: any = {}; - public location: any = {}; - public alert(msg: string): void { return; } - public confirm(msg: string): void { return; } - -} diff --git a/electron/src/app/shared/core/testing/index.ts b/electron/src/app/shared/core/testing/index.ts deleted file mode 100644 index df96806e4..000000000 --- a/electron/src/app/shared/core/testing/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -// mocks -export * from './mocks/window.mock'; - -// providers -export * from './providers/core'; -export * from './providers/http'; -export * from './providers/router'; - - diff --git a/electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts b/electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts deleted file mode 100644 index fe6b53585..000000000 --- a/electron/src/app/shared/core/testing/mocks/mock-location-strategy.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Mock location strategy (until provided by @angular) - * Copied from https://github.com/angular/angular/blob/master/modules/%40angular/common/testing/mock_location_strategy.ts - */ -import { LocationStrategy } from '@angular/common'; -import { Injectable, EventEmitter } from '@angular/core'; - -/** - * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated - * location events. - * - * @stable - */ -@Injectable() -export class MockLocationStrategy extends LocationStrategy { - internalBaseHref: string = '/'; - internalPath: string = '/'; - internalTitle: string = ''; - urlChanges: string[] = []; - /** @internal */ - _subject: EventEmitter = new EventEmitter(); - constructor() { super(); } - - simulatePopState(url: string): void { - this.internalPath = url; - this._subject.emit(new MockPopStateEvent(this.path())); - } - - path(includeHash: boolean = false): string { return this.internalPath; } - - prepareExternalUrl(internal: string): string { - if ((internal).startsWith('/') && (this.internalBaseHref).endsWith('/')) { - return this.internalBaseHref + internal.substring(1); - } - return this.internalBaseHref + internal; - } - - pushState(ctx: any, title: string, path: string, query: string): void { - this.internalTitle = title; - - var url = path + (query.length > 0 ? ('?' + query) : ''); - this.internalPath = url; - - var externalUrl = this.prepareExternalUrl(url); - this.urlChanges.push(externalUrl); - } - - replaceState(ctx: any, title: string, path: string, query: string): void { - this.internalTitle = title; - - var url = path + (query.length > 0 ? ('?' + query) : ''); - this.internalPath = url; - - var externalUrl = this.prepareExternalUrl(url); - this.urlChanges.push('replace: ' + externalUrl); - } - - onPopState(fn: (value: any) => void): void { this._subject.subscribe({next: fn}); } - - getBaseHref(): string { return this.internalBaseHref; } - - back(): void { - if (this.urlChanges.length > 0) { - this.urlChanges.pop(); - var nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : ''; - this.simulatePopState(nextUrl); - } - } - - forward(): void { throw 'not implemented'; } -} - -class MockPopStateEvent { - pop: boolean = true; - type: string = 'popstate'; - constructor(public newUrl: string) {} -} diff --git a/electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts b/electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts deleted file mode 100644 index 4ad0d29ab..000000000 --- a/electron/src/app/shared/core/testing/mocks/ng2-config.mock.ts +++ /dev/null @@ -1,30 +0,0 @@ -export class ConfigMock { - init(): any { - return null; - } - - getSettings(group?: string, key?: string): any { - return { - i18n: { - defaultLanguage: { - code: 'en', - title: 'English' - }, - availableLanguages: [ - { - code: 'en', - title: 'English' - } - ] - }, - logging: { - DEBUG: { - LEVEL_1: false, - LEVEL_2: false, - LEVEL_3: false, - LEVEL_4: false - } - } - }; - } -} diff --git a/electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts b/electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts deleted file mode 100644 index 34a41c2a1..000000000 --- a/electron/src/app/shared/core/testing/mocks/router-extensions.mock.ts +++ /dev/null @@ -1,21 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { UrlTree } from '@angular/router'; - -// module -import { IRouterExtensions, ExtendedNavigationExtras } from '../../index'; - -@Injectable() -export class RouterExtensionsMock implements IRouterExtensions { - navigate(commands: Array, extras?: ExtendedNavigationExtras): Promise { - return Promise.resolve(true); - } - - navigateByUrl(url: string | UrlTree, options?: ExtendedNavigationExtras): Promise { - return Promise.resolve(true); - } - - back(): void { - return; - } -} diff --git a/electron/src/app/shared/core/testing/mocks/window.mock.ts b/electron/src/app/shared/core/testing/mocks/window.mock.ts deleted file mode 100644 index a15a3251e..000000000 --- a/electron/src/app/shared/core/testing/mocks/window.mock.ts +++ /dev/null @@ -1,27 +0,0 @@ -export class WindowMock { - public navigator: any = { - language: 'en-US', - userAgent: 'testing' - }; - public location: any = {}; - public alert(msg: string): void { - return; - } - public confirm(msg: string): void { - return; - } -} - -export class WindowMockFrench extends WindowMock { - constructor() { - super(); - this.navigator.language = 'fr-US'; - } -} - -export class WindowMockNoLanguage extends WindowMock { - constructor() { - super(); - this.navigator.language = undefined; - } -} diff --git a/electron/src/app/shared/core/testing/providers/core.ts b/electron/src/app/shared/core/testing/providers/core.ts deleted file mode 100644 index fb4454ebd..000000000 --- a/electron/src/app/shared/core/testing/providers/core.ts +++ /dev/null @@ -1,25 +0,0 @@ -// app -import { ANALYTICS_PROVIDERS } from '../../../analytics/index'; - -// module -import { WindowService, ConsoleService, LogService, RouterExtensions, AppService } from '../../index'; - -// mocks -import { WindowMock } from '../mocks/window.mock'; -import { RouterExtensionsMock } from '../mocks/router-extensions.mock'; - -export function TEST_CORE_PROVIDERS(options?: any): Array { - // options: - // window: = custom window mock (mainly for changing out language) - - let providers = [ - { provide: ConsoleService, useValue: console }, - { provide: WindowService, useClass: (options && options.window) || WindowMock }, - LogService, - ANALYTICS_PROVIDERS, - { provide: RouterExtensions, useClass: RouterExtensionsMock }, - AppService - ]; - - return providers; -} diff --git a/electron/src/app/shared/core/testing/providers/http.ts b/electron/src/app/shared/core/testing/providers/http.ts deleted file mode 100644 index 349e486e9..000000000 --- a/electron/src/app/shared/core/testing/providers/http.ts +++ /dev/null @@ -1,39 +0,0 @@ -// angular -import { ReflectiveInjector } from '@angular/core'; -import { BaseRequestOptions, ConnectionBackend, Http } from '@angular/http'; -import { MockBackend } from '@angular/http/testing'; - -let providers: Array = [ - BaseRequestOptions, - MockBackend, - { provide: Http, - useFactory: function (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) { - return new Http(backend, defaultOptions); - }, - deps: [MockBackend, BaseRequestOptions] - } -]; - -/* -* For instances where you need the injector -* @returns `ReflectiveInjector` -*/ -export function GET_HTTP_PROVIDERS_INJECTOR(additionalProviders?: Array): ReflectiveInjector { - - if (additionalProviders) { - providers = providers.concat(additionalProviders); - } - - return ReflectiveInjector.resolveAndCreate(providers); -} - -/* -* For testing http services -* @returns `Array` -*/ -export function TEST_HTTP_PROVIDERS(): Array { - return providers; -} - - - diff --git a/electron/src/app/shared/core/testing/providers/router.ts b/electron/src/app/shared/core/testing/providers/router.ts deleted file mode 100644 index 3e4621a70..000000000 --- a/electron/src/app/shared/core/testing/providers/router.ts +++ /dev/null @@ -1,12 +0,0 @@ -// angular -import { Location, LocationStrategy, APP_BASE_HREF } from '@angular/common'; -import { SpyLocation, MockLocationStrategy } from '@angular/common/testing'; - -export function TEST_LOCATION_PROVIDERS(): Array { - - return [ - {provide: Location, useClass: SpyLocation}, - {provide: LocationStrategy, useClass: MockLocationStrategy}, - { provide: APP_BASE_HREF, useValue: '/' } - ]; -} diff --git a/electron/src/app/shared/core/utils/config.spec.ts b/electron/src/app/shared/core/utils/config.spec.ts deleted file mode 100644 index d0456b515..000000000 --- a/electron/src/app/shared/core/utils/config.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -// libs -import * as _ from 'lodash'; - -// app -import { t } from '../../test/index'; - -// module -import { Config } from './config'; - -export function main() { - t.describe('core: Config', () => { - t.be(() => Config.RESET()); - - t.it('ENVIRONMENT', () => { - t.e(Config.ENVIRONMENT).toBeDefined(); - }); - t.it('PLATFORMS', () => { - t.e(_.keys(Config.PLATFORMS).length).toBe(4); - t.e(Config.PLATFORM_TARGET).toBeDefined(); - t.e(Config.PLATFORMS.WEB).toBe('web'); - t.e(Config.PLATFORMS.MOBILE_NATIVE).toBe('mobile_native'); - t.e(Config.PLATFORMS.MOBILE_HYBRID).toBe('mobile_hybrid'); - t.e(Config.PLATFORMS.DESKTOP).toBe('desktop'); - - t.e(Config.IS_WEB).toBeDefined(); - t.e(Config.IS_MOBILE_NATIVE).toBeDefined(); - t.e(Config.IS_MOBILE_HYBRID).toBeDefined(); - t.e(Config.IS_DESKTOP).toBeDefined(); - }); - t.it('DEBUG', () => { - t.e(Config.DEBUG.LEVEL_1).toBe(false); - t.e(Config.DEBUG.LEVEL_2).toBe(false); - t.e(Config.DEBUG.LEVEL_3).toBe(false); - t.e(Config.DEBUG.LEVEL_4).toBe(false); - t.e(Config.IS_DEBUG_MODE()).toBe(false); - }); - }); -} diff --git a/electron/src/app/shared/core/utils/config.ts b/electron/src/app/shared/core/utils/config.ts deleted file mode 100644 index b338fab75..000000000 --- a/electron/src/app/shared/core/utils/config.ts +++ /dev/null @@ -1,78 +0,0 @@ -// Feel free to extend this interface -// depending on your app specific config. -export interface EnvConfig { - API?: string; - ENV?: string; -} - -export interface IPlatforms { - WEB: string; - MOBILE_NATIVE: string; - MOBILE_HYBRID: string; - DESKTOP: string; -} - -export class Config { - - public static PageClass: any; - - public static DEBUG: any = { - LEVEL_1: false, // .info only - LEVEL_2: false, // .warn only - LEVEL_3: false, // .error only - LEVEL_4: false // .log + all the above - }; - - // supported platforms - public static PLATFORMS: IPlatforms = { - WEB: 'web', - MOBILE_NATIVE: 'mobile_native', - MOBILE_HYBRID: 'mobile_hybrid', - DESKTOP: 'desktop' - }; - - // current target (defaults to web) - public static PLATFORM_TARGET: string = Config.PLATFORMS.WEB; - - // convenient platform checks - public static IS_WEB(): boolean { - return Config.PLATFORM_TARGET === Config.PLATFORMS.WEB; - } - - public static IS_MOBILE_NATIVE(): boolean { - return Config.PLATFORM_TARGET === Config.PLATFORMS.MOBILE_NATIVE; - } - - public static IS_MOBILE_HYBRID(): boolean { - return Config.PLATFORM_TARGET === Config.PLATFORMS.MOBILE_HYBRID; - } - - public static IS_DESKTOP(): boolean { - return Config.PLATFORM_TARGET === Config.PLATFORMS.DESKTOP; - } - - public static ENVIRONMENT(): EnvConfig { - try { - return JSON.parse('<%= ENV_CONFIG %>'); - } catch (exp) { - return {}; - } - } - - public static IS_DEBUG_MODE(): boolean { - for (let key in Config.DEBUG) { - if (Config.DEBUG[key]) { - // if any level is on, debug mode is on - return true; - } - } - return false; - } - - // reset debug defaults - public static RESET() { - for (let key in Config.DEBUG) { - Config.DEBUG[key] = false; - } - } -} diff --git a/electron/src/app/shared/core/utils/index.ts b/electron/src/app/shared/core/utils/index.ts deleted file mode 100644 index 7f65f1331..000000000 --- a/electron/src/app/shared/core/utils/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './config'; -export * from './type'; -export * from './view-broker'; diff --git a/electron/src/app/shared/core/utils/type.ts b/electron/src/app/shared/core/utils/type.ts deleted file mode 100644 index 8429e8877..000000000 --- a/electron/src/app/shared/core/utils/type.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * This function coerces a string into a string literal type. - * Using tagged union types in TypeScript 2.0, this enables - * powerful typechecking of our reducers. - * - * Since every action label passes through this function it - * is a good place to ensure all of our action labels - * are unique. - */ - -let typeCache: { [label: string]: boolean } = {}; -export function type(label: T | ''): T { - if (typeCache[label]) { - throw new Error(`Action type "${label}" is not unqiue"`); - } - - typeCache[label] = true; - - return label; -} diff --git a/electron/src/app/shared/core/utils/view-broker.spec.ts b/electron/src/app/shared/core/utils/view-broker.spec.ts deleted file mode 100644 index 80668913d..000000000 --- a/electron/src/app/shared/core/utils/view-broker.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -// app -import { t } from '../../test/index'; - -// module -import { Config } from './config'; -import { ViewBroker } from './view-broker'; - -export function main() { - t.describe('utilities: ViewBroker', () => { - - t.it('TEMPLATE_URL: web', () => { - Config.PLATFORM_TARGET = Config.PLATFORMS.WEB; - t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.html'); - }); - t.it('TEMPLATE_URL: mobile_native', () => { - Config.PLATFORM_TARGET = Config.PLATFORMS.MOBILE_NATIVE; - t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.tns.html'); - }); - t.it('TEMPLATE_URL: mobile_hybrid', () => { - Config.PLATFORM_TARGET = Config.PLATFORMS.MOBILE_HYBRID; - t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.html'); - }); - t.it('TEMPLATE_URL: desktop', () => { - Config.PLATFORM_TARGET = Config.PLATFORMS.DESKTOP; - t.e(ViewBroker.TEMPLATE_URL('./app/components/home/home.html')).toBe('./app/components/home/home.html'); - }); - }); -} diff --git a/electron/src/app/shared/core/utils/view-broker.ts b/electron/src/app/shared/core/utils/view-broker.ts deleted file mode 100644 index 88ef64fff..000000000 --- a/electron/src/app/shared/core/utils/view-broker.ts +++ /dev/null @@ -1,27 +0,0 @@ -// module -import { Config } from './config'; - -export class ViewBroker { - - public static TEMPLATE_URL(path: string): string { - if (Config.IS_MOBILE_NATIVE()) { - let paths = path.split('.'); - paths.splice(-1); - return `${paths.join('.')}.tns.html`; - } else { - return path; - } - } - - public static STYLE_URLS(paths: string[]): string[] { - if (Config.IS_MOBILE_NATIVE()) { - return paths.map((path) => { - let parts = path.split('.'); - parts.splice(-1); - return `${parts.join('.')}.tns.css`; - }); - } else { - return paths; - } - } -} diff --git a/electron/src/app/shared/electron/index.ts b/electron/src/app/shared/electron/index.ts deleted file mode 100644 index 51ba96e15..000000000 --- a/electron/src/app/shared/electron/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// services -export * from './services/event.service'; - -// utils -export * from './utils/desktop-config'; diff --git a/electron/src/app/shared/electron/services/event.service.ts b/electron/src/app/shared/electron/services/event.service.ts deleted file mode 100644 index a602369a5..000000000 --- a/electron/src/app/shared/electron/services/event.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -// libs -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/observable/fromEvent'; - -declare var window: any; - -export class ElectronEventService { - - public static on(name: string): Observable { - return Observable.fromEvent(window, name); - } - - // TODO: add more helpers for menu setup and more... -} diff --git a/electron/src/app/shared/electron/utils/desktop-config.spec.ts b/electron/src/app/shared/electron/utils/desktop-config.spec.ts deleted file mode 100644 index f0504af1b..000000000 --- a/electron/src/app/shared/electron/utils/desktop-config.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { t } from '../../test/index'; -import { DesktopConfig } from './desktop-config'; - -export function main() { - t.describe('electron: DesktopConfig', () => { - - t.it('SUPPORTED_LANGUAGES', () => { - t.e(DesktopConfig.SUPPORTED_LANGUAGES.length).toBe(5); - t.e(DesktopConfig.SUPPORTED_LANGUAGES[0].code).toBe('en'); - t.e(DesktopConfig.SUPPORTED_LANGUAGES[1].code).toBe('es'); - t.e(DesktopConfig.SUPPORTED_LANGUAGES[2].code).toBe('fr'); - t.e(DesktopConfig.SUPPORTED_LANGUAGES[3].code).toBe('ru'); - t.e(DesktopConfig.SUPPORTED_LANGUAGES[4].code).toBe('bg'); - }); - }); -} diff --git a/electron/src/app/shared/electron/utils/desktop-config.ts b/electron/src/app/shared/electron/utils/desktop-config.ts deleted file mode 100644 index 0d5c5290e..000000000 --- a/electron/src/app/shared/electron/utils/desktop-config.ts +++ /dev/null @@ -1,14 +0,0 @@ -// app -import { ILang } from '../../core/index'; - -export class DesktopConfig { - - public static SUPPORTED_LANGUAGES: Array = [ - { code: 'en', title: 'English' }, - { code: 'es', title: 'Spanish' }, - { code: 'fr', title: 'French' }, - { code: 'ru', title: 'Russian' }, - { code: 'bg', title: 'Bulgarian' } - ]; - -} diff --git a/electron/src/app/shared/i18n/actions/index.ts b/electron/src/app/shared/i18n/actions/index.ts deleted file mode 100644 index f34843159..000000000 --- a/electron/src/app/shared/i18n/actions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './multilingual.action'; diff --git a/electron/src/app/shared/i18n/actions/multilingual.action.ts b/electron/src/app/shared/i18n/actions/multilingual.action.ts deleted file mode 100644 index 44672ced9..000000000 --- a/electron/src/app/shared/i18n/actions/multilingual.action.ts +++ /dev/null @@ -1,62 +0,0 @@ -// libs -import { Action } from '@ngrx/store'; - -// app -import { type } from '../../core/utils/type'; - -// module -import { CATEGORY } from '../common/category.common'; - -/** - * For each action type in an action group, make a simple - * enum object for all of this group's action types. - * - * The 'type' utility function coerces strings into string - * literal types and runs a simple check to guarantee all - * action types in the application are unique. - */ -export interface IMultilingualActions { - CHANGE: string; - LANG_CHANGED: string; - LANG_UNSUPPORTED: string; -} - -export const ActionTypes: IMultilingualActions = { - CHANGE: type(`[${CATEGORY}] Change`), - LANG_CHANGED: type(`[${CATEGORY}] Lang Changed`), - LANG_UNSUPPORTED: type(`[${CATEGORY}] Lang Unsupported`) -}; - -/** - * Every action is comprised of at least a type and an optional - * payload. Expressing actions as classes enables powerful - * type checking in reducer functions. - * - * See Discriminated Unions: https://www.typescriptlang.org/docs/handbook/advanced-types.html#discriminated-unions - */ -export class ChangeAction implements Action { - type = ActionTypes.CHANGE; - - constructor(public payload: string) { } -} - -export class LangChangedAction implements Action { - type = ActionTypes.LANG_CHANGED; - - constructor(public payload: string) { } -} - -export class LangUnsupportedAction implements Action { - type = ActionTypes.LANG_UNSUPPORTED; - - constructor(public payload: string) { } -} - -/** - * Export a type alias of all actions in this action group - * so that reducers can easily compose action types - */ -export type Actions - = ChangeAction - | LangChangedAction - | LangUnsupportedAction; diff --git a/electron/src/app/shared/i18n/common/category.common.ts b/electron/src/app/shared/i18n/common/category.common.ts deleted file mode 100644 index 47c76485d..000000000 --- a/electron/src/app/shared/i18n/common/category.common.ts +++ /dev/null @@ -1 +0,0 @@ -export const CATEGORY: string = 'Multilingual'; diff --git a/electron/src/app/shared/i18n/common/index.ts b/electron/src/app/shared/i18n/common/index.ts deleted file mode 100644 index 37587663a..000000000 --- a/electron/src/app/shared/i18n/common/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './category.common'; diff --git a/electron/src/app/shared/i18n/components/index.ts b/electron/src/app/shared/i18n/components/index.ts deleted file mode 100644 index f9eb818ea..000000000 --- a/electron/src/app/shared/i18n/components/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './lang-switcher.component'; diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.html b/electron/src/app/shared/i18n/components/lang-switcher.component.html deleted file mode 100644 index 51ddf2260..000000000 --- a/electron/src/app/shared/i18n/components/lang-switcher.component.html +++ /dev/null @@ -1,5 +0,0 @@ -
- Change Language: -
diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.scss b/electron/src/app/shared/i18n/components/lang-switcher.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts b/electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts deleted file mode 100644 index f9274c5bb..000000000 --- a/electron/src/app/shared/i18n/components/lang-switcher.component.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { RouterTestingModule } from '@angular/router/testing'; - -// libs -import { StoreModule } from '@ngrx/store'; - -import { t } from '../../test/index'; -import { ILang, WindowService, ConsoleService } from '../../core/index'; -import { CoreModule } from '../../core/core.module'; -import { AnalyticsModule } from '../../analytics/analytics.module'; -import { MultilingualModule } from '../multilingual.module'; -import { MultilingualService, reducer } from '../index'; -import { TEST_MULTILINGUAL_RESET } from '../testing/index'; - -const SUPPORTED_LANGUAGES: Array = [ - { code: 'en', title: 'English' }, - { code: 'es', title: 'Spanish' }, - { code: 'fr', title: 'French' }, - { code: 'ru', title: 'Russian' }, - { code: 'bg', title: 'Bulgarian' } -]; - -// test module configuration for each test -const testModuleConfig = () => { - TestBed.configureTestingModule({ - imports: [ - CoreModule.forRoot([ - { provide: WindowService, useValue: window }, - { provide: ConsoleService, useValue: console } - ]), - RouterTestingModule, - AnalyticsModule, - MultilingualModule, - StoreModule.provideStore({ i18n: reducer }) - ], - declarations: [TestComponent] - }); -}; - -export function main() { - t.describe('i18n:', () => { - t.describe('@Component: LangSwitcherComponent', () => { - t.be(testModuleConfig); - - t.it('should work', - t.async(() => { - TestBed.compileComponents() - .then(() => { - let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - let appDOMEl = fixture.debugElement.children[0].nativeElement; - t.e(appDOMEl.querySelectorAll('form > select option').length).toBe(1); - t.e(appDOMEl.querySelectorAll('form > select option')[0].value).toBe('en'); - }); - })); - }); - - t.describe('@Component: LangSwitcherComponent with multiple languages', () => { - t.be(() => { - MultilingualService.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES; - testModuleConfig(); - }); - - // ensure statics are reset when the test had modified statics in a beforeEach (be) or beforeEachProvider (bep) - t.ae(() => TEST_MULTILINGUAL_RESET()); - - t.it('should work', - t.async(() => { - TestBed.compileComponents() - .then(() => { - let fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - let appDOMEl = fixture.debugElement.children[0].nativeElement; - t.e(appDOMEl.querySelectorAll('form > select option').length).toBe(5); - t.e(appDOMEl.querySelectorAll('form > select option')[0].value).toBe('en'); - t.e(appDOMEl.querySelectorAll('form > select option')[1].value).toBe('es'); - t.e(appDOMEl.querySelectorAll('form > select option')[2].value).toBe('fr'); - t.e(appDOMEl.querySelectorAll('form > select option')[3].value).toBe('ru'); - t.e(appDOMEl.querySelectorAll('form > select option')[4].value).toBe('bg'); - }); - })); - }); - }); -} - -@Component({ - selector: 'test-cmp', - template: '' -}) -class TestComponent {} diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.html b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.html deleted file mode 100644 index 9613fd766..000000000 --- a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss deleted file mode 100644 index c225107a0..000000000 --- a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.ios.scss +++ /dev/null @@ -1,10 +0,0 @@ -.lang-switcher { - background-color: #4f92d5; -} - -.segmented-bar { - background-color: #4f92d5; - color: #fff; - margin: 5; - selected-background-color: #fff; -} diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss b/electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss deleted file mode 100644 index ed4098596..000000000 --- a/electron/src/app/shared/i18n/components/lang-switcher.component.tns.scss +++ /dev/null @@ -1,10 +0,0 @@ -.lang-switcher { - background-color: #4f92d5; -} - -.segmented-bar { - background-color: #4f92d5; - color: #fff; - margin: 0; - selected-background-color: #fff; -} diff --git a/electron/src/app/shared/i18n/components/lang-switcher.component.ts b/electron/src/app/shared/i18n/components/lang-switcher.component.ts deleted file mode 100644 index 95ad4f1ee..000000000 --- a/electron/src/app/shared/i18n/components/lang-switcher.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -// libs -import { Component } from '@angular/core'; -import { Store } from '@ngrx/store'; - -// app -import { Config, ILang } from '../../core/index'; -import { LogService } from '../../core/services/log.service'; -import { IAppState } from '../../ngrx/index'; -import { ElectronEventService } from '../../electron/index'; -import * as multilingual from '../index'; - -@Component({ - moduleId: module.id, - selector: 'lang-switcher', - templateUrl: 'lang-switcher.component.html', - styleUrls: ['lang-switcher.component.css'], -}) -export class LangSwitcherComponent { - - public lang: string; - public supportedLanguages: Array = multilingual.MultilingualService.SUPPORTED_LANGUAGES; - - constructor(private log: LogService, private store: Store) { - store.take(1).subscribe((s: any) => { - // s && s.18n - ensures testing works in all cases (since some tests dont use i18n state) - this.lang = s && s.i18n ? s.i18n.lang : ''; - }); - - if (Config.IS_DESKTOP()) { - // allow electron menu to talk to component - ElectronEventService.on('changeLang').subscribe((e: any) => { - this.changeLang({ target: { value: e.detail.value } }); - }); - } - } - - changeLang(e: any) { - let lang = this.supportedLanguages[0].code; // fallback to default 'en' - - if (Config.IS_MOBILE_NATIVE()) { - if (e) { - lang = this.supportedLanguages[e.newIndex].code; - } - } else if (e && e.target) { - lang = e.target.value; - } - this.log.debug(`Language change: ${lang}`); - this.store.dispatch(new multilingual.ChangeAction(lang)); - } -} diff --git a/electron/src/app/shared/i18n/effects/index.ts b/electron/src/app/shared/i18n/effects/index.ts deleted file mode 100644 index 8ebec3dd7..000000000 --- a/electron/src/app/shared/i18n/effects/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './multilingual.effect'; diff --git a/electron/src/app/shared/i18n/effects/multilingual.effect.ts b/electron/src/app/shared/i18n/effects/multilingual.effect.ts deleted file mode 100644 index 25d2da87b..000000000 --- a/electron/src/app/shared/i18n/effects/multilingual.effect.ts +++ /dev/null @@ -1,39 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; - -// libs -import { Store, Action } from '@ngrx/store'; -import { Effect, Actions } from '@ngrx/effects'; -import { includes, map } from 'lodash'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/operator/map'; - -// module -import { MultilingualService } from '../services/multilingual.service'; -import * as multilingual from '../actions/multilingual.action'; - -@Injectable() -export class MultilingualEffects { - - @Effect() change$: Observable = this.actions$ - .ofType(multilingual.ActionTypes.CHANGE) - .map(action => { - let lang = action.payload; - if (includes(map(MultilingualService.SUPPORTED_LANGUAGES, 'code'), lang)) { - let langChangedAction = new multilingual.LangChangedAction(lang); - // track analytics - this.multilangService.track(langChangedAction.type, { label: langChangedAction.payload }); - // change state - return new multilingual.LangChangedAction(lang); - } else { - // not supported (here for example) - return new multilingual.LangUnsupportedAction(lang); - } - }); - - constructor( - private store: Store, - private actions$: Actions, - private multilangService: MultilingualService - ) { } -} diff --git a/electron/src/app/shared/i18n/index.ts b/electron/src/app/shared/i18n/index.ts deleted file mode 100644 index 695d05723..000000000 --- a/electron/src/app/shared/i18n/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -// services -export * from './services/index'; - -// components -export * from './components/index'; - -// actions -export * from './actions/index'; - -// effects -export * from './effects/index'; - -// reducers -export * from './reducers/index'; - -// state -export * from './states/index'; diff --git a/electron/src/app/shared/i18n/multilingual.module.ts b/electron/src/app/shared/i18n/multilingual.module.ts deleted file mode 100644 index 09ebb1430..000000000 --- a/electron/src/app/shared/i18n/multilingual.module.ts +++ /dev/null @@ -1,71 +0,0 @@ -// angular -import { NgModule, ModuleWithProviders, Optional, SkipSelf, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { HttpModule, Http } from '@angular/http'; - -// libs -import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; -import { TranslateHttpLoader } from '@ngx-translate/http-loader'; - -// app -import { Config } from '../core/index'; - -// module -import { LangSwitcherComponent } from './components/index'; -import { MultilingualService } from './services/index'; - -// for AoT compilation -export function translateLoaderFactory(http: Http) { - return new TranslateHttpLoader(http, `${Config.IS_MOBILE_NATIVE() ? '/' : ''}assets/i18n/`, '.json'); -}; - -/** - * Do not specify providers for modules that might be imported by a lazy loaded module. - */ - -@NgModule({ - imports: [ - CommonModule, - RouterModule, - FormsModule, - HttpModule, - TranslateModule.forRoot([{ - provide: TranslateLoader, - deps: [Http], - useFactory: (translateLoaderFactory) - }]), - ], - declarations: [ - LangSwitcherComponent - ], - exports: [ - LangSwitcherComponent, - TranslateModule - ], - providers: [ - MultilingualService - ], - schemas: [ - NO_ERRORS_SCHEMA, - CUSTOM_ELEMENTS_SCHEMA - ] -}) -export class MultilingualModule { - - // optional usage - // ideally we could use this to override TranslateModule, but it requires the static above at moment - static forRoot(configuredProviders: Array): ModuleWithProviders { - return { - ngModule: MultilingualModule, - providers: configuredProviders - }; - } - - constructor(@Optional() @SkipSelf() parentModule: MultilingualModule) { - if (parentModule) { - throw new Error('MultilingualModule already loaded; Import in root module only.'); - } - } -} diff --git a/electron/src/app/shared/i18n/reducers/index.ts b/electron/src/app/shared/i18n/reducers/index.ts deleted file mode 100644 index b020a11e9..000000000 --- a/electron/src/app/shared/i18n/reducers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './multilingual.reducer'; diff --git a/electron/src/app/shared/i18n/reducers/multilingual.reducer.ts b/electron/src/app/shared/i18n/reducers/multilingual.reducer.ts deleted file mode 100644 index 2e7e7d18b..000000000 --- a/electron/src/app/shared/i18n/reducers/multilingual.reducer.ts +++ /dev/null @@ -1,20 +0,0 @@ -// module -import { IMultilingualState, initialState } from '../states/multilingual.state'; -import { Actions, ActionTypes } from '../actions/multilingual.action'; - -export function reducer( - state: IMultilingualState = initialState, - action: Actions -): IMultilingualState { - switch (action.type) { - case ActionTypes.LANG_CHANGED: - if (state.lang !== action.payload) - return (Object).assign({}, state, { - lang: action.payload - }); - - return state; - default: - return state; - } -} diff --git a/electron/src/app/shared/i18n/services/i18n.providers.ts b/electron/src/app/shared/i18n/services/i18n.providers.ts deleted file mode 100644 index cca616364..000000000 --- a/electron/src/app/shared/i18n/services/i18n.providers.ts +++ /dev/null @@ -1,31 +0,0 @@ -// import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID } from '@angular/core'; -// -// export class TranslationProviders { -// -// public getTranslationFile = (): Promise => { -// let noProviders: Object[] = []; -// -// // Define a way to retrieve the local information -// let locale: string = 'en-US'; -// -// // Set the directory to the translation files -// let file: string = `../assets/locale/messages.${locale}.xlf`; -// -// if(!locale || locale === 'en-US') return Promise.resolve(noProviders); -// -// return new Promise(function (resolve, reject) { -// let xhr = new XMLHttpRequest; -// xhr.open('GET', file); -// xhr.onload = (data: any) => resolve( -// [ -// { provide: TRANSLATIONS, useValue: data.target.response }, -// { provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }, -// { provide: LOCALE_ID, useValue: locale } -// ] -// ); -// xhr.onerror = () => reject(noProviders); -// xhr.send(); -// }); -// } -// }; -// diff --git a/electron/src/app/shared/i18n/services/index.ts b/electron/src/app/shared/i18n/services/index.ts deleted file mode 100644 index cb96e3c1c..000000000 --- a/electron/src/app/shared/i18n/services/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './multilingual.service'; diff --git a/electron/src/app/shared/i18n/services/multilingual.service.spec.ts b/electron/src/app/shared/i18n/services/multilingual.service.spec.ts deleted file mode 100644 index 5c272edec..000000000 --- a/electron/src/app/shared/i18n/services/multilingual.service.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -// angular -import { TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -// libs -import { Store, StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { Angulartics2Module } from 'angulartics2'; -import { Angulartics2Segment } from 'angulartics2/dist/providers/segment/angulartics2-segment'; - -// app -import { t } from '../../test/index'; -import { CoreModule } from '../../core/core.module'; -import { ILang, WindowService, ConsoleService } from '../../core/index'; -import { TEST_CORE_PROVIDERS, WindowMockFrench } from '../../core/testing/index'; - -// module -import { TEST_MULTILINGUAL_PROVIDERS, TEST_MULTILINGUAL_RESET } from '../testing/index'; -import { IMultilingualState, MultilingualService, MultilingualEffects, reducer, ChangeAction } from '../index'; - -// test module configuration for each test -const testModuleConfig = (options?: any) => { - TestBed.configureTestingModule({ - imports: [ - CoreModule.forRoot([ - { provide: WindowService, useValue: window }, - { provide: ConsoleService, useValue: console } - ]), - Angulartics2Module.forRoot([ - Angulartics2Segment - ]), - StoreModule.provideStore({ i18n: reducer }), - EffectsModule.run(MultilingualEffects), - RouterTestingModule - ], - providers: [ - TEST_CORE_PROVIDERS(options), - TEST_MULTILINGUAL_PROVIDERS() - ] - }); -}; - -export function main() { - t.describe('i18n:', () => { - t.describe('MultilingualService', () => { - - t.be(() => { - testModuleConfig(); - }); - - t.it('should at a minimum support english', () => { - t.e(MultilingualService.SUPPORTED_LANGUAGES.length).toBe(1); - t.e(MultilingualService.SUPPORTED_LANGUAGES[0].code).toBe('en'); - }); - - t.it('changeLang - should not switch unless supported', t.inject([MultilingualService, Store], (multilang: MultilingualService, store: Store) => { - store.dispatch(new ChangeAction('fr')); - // only 'en' supported by default so changing to 'fr' should not change state - store.select('i18n').subscribe((i18n: IMultilingualState) => { - t.e(i18n.lang).toBe('en'); - }); - })); - - }); - - t.describe('MultilingualService for French browser/platform', () => { - const SUPPORTED_LANGUAGES: Array = [ - { code: 'en', title: 'English' }, - { code: 'fr', title: 'French' } - ]; - - t.be(() => { - MultilingualService.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES; - testModuleConfig({ window: WindowMockFrench }); - }); - - // ensure statics are reset when the test had modified statics in a beforeEach (be) or beforeEachProvider (bep) - t.ae(() => TEST_MULTILINGUAL_RESET()); - - t.it('should now support french by default', t.inject([MultilingualService, Store, WindowService], (multilang: MultilingualService, store: Store, win: WindowService) => { - t.e(MultilingualService.SUPPORTED_LANGUAGES.length).toBe(2); - t.e(MultilingualService.SUPPORTED_LANGUAGES[0].code).toBe('en'); - t.e(MultilingualService.SUPPORTED_LANGUAGES[1].code).toBe('fr'); - t.e(win.navigator.language).toBe('fr-US'); - - store.select('i18n').subscribe((i18n: IMultilingualState) => { - t.e(i18n.lang).toBe('fr'); - }); - })); - }); - }); -} diff --git a/electron/src/app/shared/i18n/services/multilingual.service.ts b/electron/src/app/shared/i18n/services/multilingual.service.ts deleted file mode 100644 index b069700a7..000000000 --- a/electron/src/app/shared/i18n/services/multilingual.service.ts +++ /dev/null @@ -1,52 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; - -// libs -import { Store } from '@ngrx/store'; -import { TranslateService } from '@ngx-translate/core'; - -// app -import { Analytics, AnalyticsService } from '../../analytics/index'; -import { ILang } from '../../core/index'; -import { WindowService } from '../../core/services/window.service'; - -// module -import { CATEGORY } from '../common/category.common'; -import { IMultilingualState } from '../states/index'; -import { ChangeAction } from '../actions/index'; - -// service -@Injectable() -export class MultilingualService extends Analytics { - - // default supported languages - // see web.module.ts for example of how to provide different value - public static SUPPORTED_LANGUAGES: Array = [ - { code: 'en', title: 'English' } - ]; - - constructor( - public analytics: AnalyticsService, - private translate: TranslateService, - private win: WindowService, - private store: Store - ) { - super(analytics); - this.category = CATEGORY; - - // this language will be used as a fallback when a translation isn't found in the current language - translate.setDefaultLang('en'); - - // use browser/platform lang if available - let userLang = win.navigator.language.split('-')[0]; - - // subscribe to changes - store.select('i18n').subscribe((state: IMultilingualState) => { - // update ng2-translate which will cause translations to occur wherever the TranslatePipe is used in the view - this.translate.use(state.lang); - }); - - // init the lang - this.store.dispatch(new ChangeAction(userLang)); - } -} diff --git a/electron/src/app/shared/i18n/states/index.ts b/electron/src/app/shared/i18n/states/index.ts deleted file mode 100644 index c635f73a4..000000000 --- a/electron/src/app/shared/i18n/states/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './multilingual.state'; diff --git a/electron/src/app/shared/i18n/states/multilingual.state.ts b/electron/src/app/shared/i18n/states/multilingual.state.ts deleted file mode 100644 index e58aade06..000000000 --- a/electron/src/app/shared/i18n/states/multilingual.state.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Observable } from 'rxjs/Observable'; - -export interface IMultilingualState { - lang: string; -} - -export const initialState: IMultilingualState = { - lang: 'en' -}; - -export function getLang(state$: Observable) { - return state$.select(state => state.lang); -} diff --git a/electron/src/app/shared/i18n/testing/index.ts b/electron/src/app/shared/i18n/testing/index.ts deleted file mode 100644 index 2f27376e9..000000000 --- a/electron/src/app/shared/i18n/testing/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -// libs -import { TranslateService, TranslateLoader } from '@ngx-translate/core'; - -// module -import { MultilingualService } from '../index'; - -// mocks -import { TranslateMock } from './mocks/ng2-translate.mock'; -import { TranslateLoaderMock } from './mocks/ng2-translate-loader.mock'; - -export function TEST_MULTILINGUAL_PROVIDERS(): Array { - - let providers: Array = [ - { provide: TranslateLoader, useClass: TranslateLoaderMock }, - { provide: TranslateService, useClass: TranslateMock }, - MultilingualService - ]; - - return providers; -} - -export function TEST_MULTILINGUAL_RESET(): void { - // ensure static is reset - MultilingualService.SUPPORTED_LANGUAGES = [ - { code: 'en', title: 'English' } - ]; -} diff --git a/electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts b/electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts deleted file mode 100644 index d54afb7dc..000000000 --- a/electron/src/app/shared/i18n/testing/mocks/ng2-config-multilang.mock.ts +++ /dev/null @@ -1,31 +0,0 @@ -export class ConfigMockMultilang { - init(): any { - return null; - } - - getSettings(group?: string, key?: string): any { - return { - i18n: { - defaultLanguage: { - code: 'en', - title: 'English' - }, - availableLanguages: [ - { code: 'en', title: 'English' }, - { code: 'es', title: 'Spanish' }, - { code: 'fr', title: 'French' }, - { code: 'ru', title: 'Russian' }, - { code: 'bg', title: 'Bulgarian' } - ] - }, - logging: { - DEBUG: { - LEVEL_1: false, - LEVEL_2: false, - LEVEL_3: false, - LEVEL_4: false - } - } - }; - } -} diff --git a/electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts b/electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts deleted file mode 100644 index a54a8fc6d..000000000 --- a/electron/src/app/shared/i18n/testing/mocks/ng2-translate-loader.mock.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class TranslateLoaderMock { - -} diff --git a/electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts b/electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts deleted file mode 100644 index b6fce836d..000000000 --- a/electron/src/app/shared/i18n/testing/mocks/ng2-translate.mock.ts +++ /dev/null @@ -1,31 +0,0 @@ -//angular -import { EventEmitter } from '@angular/core'; - -// libs -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/observable/of'; - -export class TranslateMock { - public onLangChange: EventEmitter = new EventEmitter(); - public onTranslationChange: EventEmitter = new EventEmitter(); - public getTranslation(lang: string): any { - return { - 'TEST': 'test' - }; - } - public use(lang: string) { - // console.log(lang); - } - public get(key: string | Array, interpolateParams?: Object): Observable { - return Observable.of(key); - } - public setDefaultLang(lang: string) { - return; - } - public getLangs() { - return ['en']; - } - public reloadLang(lang: string): Observable { - return Observable.of('en'); - } -} diff --git a/electron/src/app/shared/ngrx/index.ts b/electron/src/app/shared/ngrx/index.ts deleted file mode 100644 index 93a071f7b..000000000 --- a/electron/src/app/shared/ngrx/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -// state -export * from './state/app.state'; diff --git a/electron/src/app/shared/ngrx/state/app.state.ts b/electron/src/app/shared/ngrx/state/app.state.ts deleted file mode 100644 index eb397659b..000000000 --- a/electron/src/app/shared/ngrx/state/app.state.ts +++ /dev/null @@ -1,85 +0,0 @@ -// libs -import { Observable } from 'rxjs/Observable'; -// import { combineLatest } from 'rxjs/observable/combineLatest'; -import { ActionReducer } from '@ngrx/store'; -import '@ngrx/core/add/operator/select'; - -/** - * The compose function is one of our most handy tools. In basic terms, you give - * it any number of functions and it returns a function. This new function - * takes a value and chains it through every composed function, returning - * the output. - * - * More: https://drboolean.gitbooks.io/mostly-adequate-guide/content/ch5.html - */ -import { compose } from '@ngrx/core/compose'; - -/** - * storeFreeze prevents state from being mutated. When mutation occurs, an - * exception will be thrown. This is useful during development mode to - * ensure that none of the reducers accidentally mutates the state. - */ -import { storeFreeze } from 'ngrx-store-freeze'; - -/** - * combineReducers is another useful metareducer that takes a map of reducer - * functions and creates a new reducer that stores the gathers the values - * of each reducer and stores them using the reducer's key. Think of it - * almost like a database, where every reducer is a table in the db. - * - * More: https://egghead.io/lessons/javascript-redux-implementing-combinereducers-from-scratch - */ -import { combineReducers } from '@ngrx/store'; - -/** - * Every reducer module's default export is the reducer function itself. In - * addition, each module should export a type or interface that describes - * the state of the reducer plus any selector functions. The `* as` - * notation packages up all of the exports into a single object. - */ -import * as fromMultilingual from '../../i18n/index'; -import { IMultilingualState } from '../../i18n/index'; -import * as fromSample from '../../sample/index'; -import { ISampleState } from '../../sample/index'; - -/** - * As mentioned, we treat each reducer like a table in a database. This means - * our top level state interface is just a map of keys to inner state types. - */ -export interface IAppState { - i18n: fromMultilingual.IMultilingualState; - sample: fromSample.ISampleState; -}; - -/** - * Because metareducers take a reducer function and return a new reducer, - * we can use our compose helper to chain them together. Here we are - * using combineReducers to make our top level reducer, and then - * wrapping that in storeLogger. Remember that compose applies - * the result from right to left. - */ -const reducers = { - i18n: fromMultilingual.reducer, - sample: fromSample.reducer -}; - -const developmentReducer: ActionReducer = compose(storeFreeze, combineReducers)(reducers); -const productionReducer: ActionReducer = combineReducers(reducers); - -export function AppReducer(state: any, action: any) { - if (String('<%= BUILD_TYPE %>') === 'dev') { - return developmentReducer(state, action); - } else { - return productionReducer(state, action); - } -} - -export function getMultilingualState(state$: Observable): Observable { - return state$.select(s => s.i18n); -} -export function getNameListState(state$: Observable): Observable { - return state$.select(s => s.sample); -} - -export const getLang: any = compose(fromMultilingual.getLang, getMultilingualState); -export const getNames: any = compose(fromSample.getNames, getNameListState); diff --git a/electron/src/app/shared/sample/actions/index.ts b/electron/src/app/shared/sample/actions/index.ts deleted file mode 100644 index 31423efda..000000000 --- a/electron/src/app/shared/sample/actions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './name-list.action'; diff --git a/electron/src/app/shared/sample/actions/name-list.action.ts b/electron/src/app/shared/sample/actions/name-list.action.ts deleted file mode 100644 index 3aa117fcc..000000000 --- a/electron/src/app/shared/sample/actions/name-list.action.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Action } from '@ngrx/store'; -import { type } from '../../core/utils/type'; -import { CATEGORY } from '../common/category.common'; - -/** - * For each action type in an action group, make a simple - * enum object for all of this group's action types. - * - * The 'type' utility function coerces strings into string - * literal types and runs a simple check to guarantee all - * action types in the application are unique. - */ -export interface INameListActions { - INIT: string; - INITIALIZED: string; - INIT_FAILED: string; - ADD: string; - NAME_ADDED: string; -} - -export const ActionTypes: INameListActions = { - INIT: type(`${CATEGORY} Init`), - INITIALIZED: type(`${CATEGORY} Initialized`), - INIT_FAILED: type(`${CATEGORY} Init Failed`), - ADD: type(`${CATEGORY} Add`), - NAME_ADDED: type(`${CATEGORY} Name Added`) -}; - -/** - * Every action is comprised of at least a type and an optional - * payload. Expressing actions as classes enables powerful - * type checking in reducer functions. - * - * See Discriminated Unions: https://www.typescriptlang.org/docs/handbook/advanced-types.html#discriminated-unions - */ -export class InitAction implements Action { - type = ActionTypes.INIT; - payload: string = null; -} - -export class InitializedAction implements Action { - type = ActionTypes.INITIALIZED; - - constructor(public payload: Array) { } -} - -export class InitFailedAction implements Action { - type = ActionTypes.INIT_FAILED; - payload: string = null; -} - -export class AddAction implements Action { - type = ActionTypes.ADD; - - constructor(public payload: string) { } -} - -export class NameAddedAction implements Action { - type = ActionTypes.NAME_ADDED; - - constructor(public payload: string) { } -} - -/** - * Export a type alias of all actions in this action group - * so that reducers can easily compose action types - */ -export type Actions - = InitAction - | InitializedAction - | InitFailedAction - | AddAction - | NameAddedAction; diff --git a/electron/src/app/shared/sample/common/category.common.ts b/electron/src/app/shared/sample/common/category.common.ts deleted file mode 100644 index 6a9a20f4b..000000000 --- a/electron/src/app/shared/sample/common/category.common.ts +++ /dev/null @@ -1 +0,0 @@ -export const CATEGORY: string = 'Sample'; diff --git a/electron/src/app/shared/sample/common/index.ts b/electron/src/app/shared/sample/common/index.ts deleted file mode 100644 index 37587663a..000000000 --- a/electron/src/app/shared/sample/common/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './category.common'; diff --git a/electron/src/app/shared/sample/components/index.ts b/electron/src/app/shared/sample/components/index.ts deleted file mode 100644 index 2e7c9e8f9..000000000 --- a/electron/src/app/shared/sample/components/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NavbarComponent } from './navbar.component'; -import { ToolbarComponent } from './toolbar.component'; - -export const SAMPLE_COMPONENTS: any[] = [ - NavbarComponent, - ToolbarComponent -]; - -export * from './navbar.component'; -export * from './toolbar.component'; diff --git a/electron/src/app/shared/sample/components/navbar.component.css b/electron/src/app/shared/sample/components/navbar.component.css deleted file mode 100644 index 2e71ed6ca..000000000 --- a/electron/src/app/shared/sample/components/navbar.component.css +++ /dev/null @@ -1,23 +0,0 @@ -:host { - border-color: #e1e1e1; - border-style: solid; - border-width: 0 0 1px; - display: block; - height: 48px; - padding: 0 16px; -} - -nav a { - color: #8f8f8f; - font-size: 14px; - font-weight: 500; - line-height: 48px; - margin-right: 20px; - text-decoration: none; - vertical-align: middle; - cursor: pointer; -} - -nav a.router-link-active { - color: #106cc8; -} diff --git a/electron/src/app/shared/sample/components/navbar.component.html b/electron/src/app/shared/sample/components/navbar.component.html deleted file mode 100644 index 9aa486ce6..000000000 --- a/electron/src/app/shared/sample/components/navbar.component.html +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/electron/src/app/shared/sample/components/navbar.component.tns.css b/electron/src/app/shared/sample/components/navbar.component.tns.css deleted file mode 100644 index 3c0f17d6c..000000000 --- a/electron/src/app/shared/sample/components/navbar.component.tns.css +++ /dev/null @@ -1,12 +0,0 @@ -.nav { - padding: 10; -} - -.nav button { - margin: 0 20 0 0; - color: #777; -} - -.nav button.active { - color: #106cc8; -} diff --git a/electron/src/app/shared/sample/components/navbar.component.tns.html b/electron/src/app/shared/sample/components/navbar.component.tns.html deleted file mode 100644 index 4a7e1ad3a..000000000 --- a/electron/src/app/shared/sample/components/navbar.component.tns.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/electron/src/app/shared/sample/components/navbar.component.ts b/electron/src/app/shared/sample/components/navbar.component.ts deleted file mode 100644 index bee4e5c8d..000000000 --- a/electron/src/app/shared/sample/components/navbar.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -// app -import { Component } from '@angular/core'; - -@Component({ - moduleId: module.id, - selector: 'sd-navbar', - templateUrl: 'navbar.component.html', - styleUrls: [ - 'navbar.component.css', - ], -}) -export class NavbarComponent { -} diff --git a/electron/src/app/shared/sample/components/toolbar.component.css b/electron/src/app/shared/sample/components/toolbar.component.css deleted file mode 100644 index a8b28f447..000000000 --- a/electron/src/app/shared/sample/components/toolbar.component.css +++ /dev/null @@ -1,40 +0,0 @@ -:host { - background-color: #106cc8; - color: rgba(255, 255, 255, 0.87); - display: block; - height: 48px; - padding: 0 16px; - position: relative; -} - -h1 { - display: inline; - font-size: 20px; - font-weight: normal; - letter-spacing: 0.1px; - line-height: 48px; -} - -:host lang-switcher, -:host .more { - position: absolute; -} - -:host lang-switcher { - top: 13px; - right: 52px; -} - -.more { - background: url("./assets/svg/more.svg"); - top: 12px; - right: 10px; - height: 24px; - width: 24px; - cursor: pointer; - opacity: 0.7; -} - -.more:hover { - opacity: 1; -} diff --git a/electron/src/app/shared/sample/components/toolbar.component.html b/electron/src/app/shared/sample/components/toolbar.component.html deleted file mode 100644 index 9420eb758..000000000 --- a/electron/src/app/shared/sample/components/toolbar.component.html +++ /dev/null @@ -1,3 +0,0 @@ -

Angular Seed Advanced

- -
diff --git a/electron/src/app/shared/sample/components/toolbar.component.tns.css b/electron/src/app/shared/sample/components/toolbar.component.tns.css deleted file mode 100644 index f1dd26dc2..000000000 --- a/electron/src/app/shared/sample/components/toolbar.component.tns.css +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Intentionally blank. - * Ignore or build out a view and insert in a {N} view to use. - * A file must at least exist since ToolbarComponent is declared in the SampleModule -**/ - diff --git a/electron/src/app/shared/sample/components/toolbar.component.tns.html b/electron/src/app/shared/sample/components/toolbar.component.tns.html deleted file mode 100644 index e5021a003..000000000 --- a/electron/src/app/shared/sample/components/toolbar.component.tns.html +++ /dev/null @@ -1,9 +0,0 @@ - - diff --git a/electron/src/app/shared/sample/components/toolbar.component.ts b/electron/src/app/shared/sample/components/toolbar.component.ts deleted file mode 100644 index 45b2391de..000000000 --- a/electron/src/app/shared/sample/components/toolbar.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component } from '@angular/core'; - -// app -import { LogService } from '../../core/index'; - -@Component({ - moduleId: module.id, - selector: 'sd-toolbar', - templateUrl: 'toolbar.component.html', - styleUrls: [ - 'toolbar.component.css', - ], -}) -export class ToolbarComponent { - - constructor(private log: LogService) {} - - public openLanguages(e: any): void { - this.log.debug('openLanguages'); - } -} diff --git a/electron/src/app/shared/sample/effects/index.ts b/electron/src/app/shared/sample/effects/index.ts deleted file mode 100644 index fc7c0d973..000000000 --- a/electron/src/app/shared/sample/effects/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './name-list.effect'; diff --git a/electron/src/app/shared/sample/effects/name-list.effect.ts b/electron/src/app/shared/sample/effects/name-list.effect.ts deleted file mode 100644 index e5d9871fc..000000000 --- a/electron/src/app/shared/sample/effects/name-list.effect.ts +++ /dev/null @@ -1,45 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; - -// libs -import { Store, Action } from '@ngrx/store'; -import { Effect, Actions } from '@ngrx/effects'; -import { Observable } from 'rxjs/Observable'; - -// module -import { NameListService } from '../services/name-list.service'; -import * as nameList from '../actions/name-list.action'; - -@Injectable() -export class NameListEffects { - - /** - * This effect makes use of the `startWith` operator to trigger - * the effect immediately on startup. - */ - @Effect() init$: Observable = this.actions$ - .ofType(nameList.ActionTypes.INIT) - .startWith(new nameList.InitAction) - .switchMap(() => this.nameListService.getNames()) - .map(payload => { - let names = payload; - return new nameList.InitializedAction(names); - }) - // nothing reacting to failure at moment but you could if you want (here for example) - .catch(() => Observable.of(new nameList.InitFailedAction())); - - @Effect() add$: Observable = this.actions$ - .ofType(nameList.ActionTypes.ADD) - .map(action => { - let name = action.payload; - // analytics - this.nameListService.track(nameList.ActionTypes.NAME_ADDED, { label: name }); - return new nameList.NameAddedAction(name); - }); - - constructor( - private store: Store, - private actions$: Actions, - private nameListService: NameListService - ) { } -} diff --git a/electron/src/app/shared/sample/index.ts b/electron/src/app/shared/sample/index.ts deleted file mode 100644 index 100c48f07..000000000 --- a/electron/src/app/shared/sample/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -// components -export * from './components/index'; - -// services -export * from './services/index'; - -// actions -export * from './actions/index'; - -// effects -export * from './effects/index'; - -// reducers -export * from './reducers/index'; - -// state -export * from './states/index'; diff --git a/electron/src/app/shared/sample/reducers/index.ts b/electron/src/app/shared/sample/reducers/index.ts deleted file mode 100644 index b89e70d39..000000000 --- a/electron/src/app/shared/sample/reducers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './name-list.reducer'; diff --git a/electron/src/app/shared/sample/reducers/name-list.reducer.ts b/electron/src/app/shared/sample/reducers/name-list.reducer.ts deleted file mode 100644 index ae9fb93fb..000000000 --- a/electron/src/app/shared/sample/reducers/name-list.reducer.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ISampleState, initialState } from '../states/index'; -import * as actions from '../actions/name-list.action'; - -export function reducer( - state: ISampleState = initialState, - action: actions.Actions -): ISampleState { - switch (action.type) { - case actions.ActionTypes.INITIALIZED: - return (Object).assign({}, state, { - names: action.payload - }); - - case actions.ActionTypes.NAME_ADDED: - return (Object).assign({}, state, { - names: [...state.names, action.payload] - }); - - default: - return state; - } -} diff --git a/electron/src/app/shared/sample/sample.module.ts b/electron/src/app/shared/sample/sample.module.ts deleted file mode 100644 index 7e947e7da..000000000 --- a/electron/src/app/shared/sample/sample.module.ts +++ /dev/null @@ -1,47 +0,0 @@ -// angular -import { NgModule, Optional, SkipSelf, NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { HttpModule } from '@angular/http'; -import { RouterModule } from '@angular/router'; - -// app -import { SAMPLE_COMPONENTS } from './components/index'; -import { SAMPLE_PROVIDERS } from './services/index'; -import { MultilingualModule } from '../i18n/multilingual.module'; - -/** - * Do not specify providers for modules that might be imported by a lazy loaded module. - */ - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - HttpModule, - RouterModule, - MultilingualModule, - ], - declarations: [ - SAMPLE_COMPONENTS - ], - providers: [ - SAMPLE_PROVIDERS - ], - schemas: [ - NO_ERRORS_SCHEMA, - CUSTOM_ELEMENTS_SCHEMA - ], - exports: [ - SAMPLE_COMPONENTS, - MultilingualModule - ] -}) -export class SampleModule { - - constructor(@Optional() @SkipSelf() parentModule: SampleModule) { - if (parentModule) { - throw new Error('SampleModule already loaded; Import in root module only.'); - } - } -} diff --git a/electron/src/app/shared/sample/services/app-config.spec.ts b/electron/src/app/shared/sample/services/app-config.spec.ts deleted file mode 100644 index a20caac7e..000000000 --- a/electron/src/app/shared/sample/services/app-config.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { t } from '../../test/index'; -import { AppConfig } from './app-config'; - -export function main() { - t.describe('app: AppConfig', () => { - - t.it('SUPPORTED_LANGUAGES', () => { - t.e(AppConfig.SUPPORTED_LANGUAGES.length).toBe(5); - t.e(AppConfig.SUPPORTED_LANGUAGES[0].code).toBe('en'); - t.e(AppConfig.SUPPORTED_LANGUAGES[1].code).toBe('es'); - t.e(AppConfig.SUPPORTED_LANGUAGES[2].code).toBe('fr'); - t.e(AppConfig.SUPPORTED_LANGUAGES[3].code).toBe('ru'); - t.e(AppConfig.SUPPORTED_LANGUAGES[4].code).toBe('bg'); - }); - }); -} diff --git a/electron/src/app/shared/sample/services/app-config.ts b/electron/src/app/shared/sample/services/app-config.ts deleted file mode 100644 index 7b334bfb6..000000000 --- a/electron/src/app/shared/sample/services/app-config.ts +++ /dev/null @@ -1,14 +0,0 @@ -// app -import { ILang } from '../../core/index'; - -export class AppConfig { - - public static SUPPORTED_LANGUAGES: Array = [ - { code: 'en', title: 'English' }, - { code: 'es', title: 'Spanish' }, - { code: 'fr', title: 'French' }, - { code: 'ru', title: 'Russian' }, - { code: 'bg', title: 'Bulgarian' } - ]; - -} diff --git a/electron/src/app/shared/sample/services/index.ts b/electron/src/app/shared/sample/services/index.ts deleted file mode 100644 index a713d124e..000000000 --- a/electron/src/app/shared/sample/services/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { NameListService } from './name-list.service'; - -export const SAMPLE_PROVIDERS: any[] = [ - NameListService -]; - -export * from './name-list.service'; diff --git a/electron/src/app/shared/sample/services/name-list.service.spec.ts b/electron/src/app/shared/sample/services/name-list.service.spec.ts deleted file mode 100644 index d9370e203..000000000 --- a/electron/src/app/shared/sample/services/name-list.service.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { TestBed, getTestBed } from '@angular/core/testing'; -import { Injector } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; -import { ResponseOptions, Response, XHRBackend, HttpModule } from '@angular/http'; -import { MockBackend, MockConnection } from '@angular/http/testing'; - -// libs -import { Store, StoreModule } from '@ngrx/store'; -import { EffectsTestingModule, EffectsRunner } from '@ngrx/effects/testing'; - -// app -import { t } from '../../test/index'; -// import {TEST_CORE_PROVIDERS, GET_HTTP_PROVIDERS_INJECTOR, TEST_LOCATION_PROVIDERS} from '../../core/testing/index'; -import { AnalyticsModule } from '../../analytics/analytics.module'; -import { NameListService, NameListEffects, reducer, InitAction, InitializedAction, AddAction, NameAddedAction } from '../index'; - -// test module configuration for each test -const testModuleConfig = () => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, AnalyticsModule, - StoreModule.provideStore({ sample: reducer }), - EffectsTestingModule, - HttpModule, RouterTestingModule - ], - providers: [ - NameListService, - NameListEffects, - {provide: XHRBackend, useClass: MockBackend} - ] - }); -}; - -const mockBackendResponse = (connection: MockConnection, response: string) => { - connection.mockRespond(new Response(new ResponseOptions({body: response}))); -}; - -export function main() { - t.describe('app: NameListService', () => { - let injector: Injector; - let backend: MockBackend; - let nameList: NameListService; - let store: Store; - let runner: EffectsRunner; // ngrx/effects tester - let nameListEffects: NameListEffects; - let connection: MockConnection; // this will be set when a new connection is emitted from the backend. - - t.be(() => { - testModuleConfig(); - injector = getTestBed(); - backend = injector.get(XHRBackend); - store = injector.get(Store); - runner = injector.get(EffectsRunner); - nameListEffects = injector.get(NameListEffects); - // sets the connection when someone tries to access the backend with an xhr request - backend.connections.subscribe((c: MockConnection) => connection = c); - // construct after setting up connections above - nameList = injector.get(NameListService); - }); - - t.it('should initialize', () => { - runner.queue(new InitAction()); - - nameListEffects.init$.subscribe(result => { - t.e(result).toEqual(new InitializedAction([ 'Dijkstra', 'Hopper' ])); - }); - - // mock response after the xhr request (which happens in constructor), otherwise it will be undefined - mockBackendResponse(connection, '["Dijkstra", "Hopper"]'); - }); - - t.it('add action', () => { - runner.queue(new AddAction('Minko')); - - nameListEffects.add$.subscribe(result => { - t.e(result).toEqual(new NameAddedAction('Minko')); - }); - }); - }); -} diff --git a/electron/src/app/shared/sample/services/name-list.service.ts b/electron/src/app/shared/sample/services/name-list.service.ts deleted file mode 100644 index fbc61a7c1..000000000 --- a/electron/src/app/shared/sample/services/name-list.service.ts +++ /dev/null @@ -1,34 +0,0 @@ -// angular -import { Injectable } from '@angular/core'; -import { Http } from '@angular/http'; - -// libs -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs/Observable'; - -// app -import { Config } from '../../core/index'; -import { Analytics, AnalyticsService } from '../../analytics/index'; -import { CATEGORY } from '../common/category.common'; - -// module -import { ISampleState } from '../states/index'; -import * as actions from '../actions/name-list.action'; - -@Injectable() -export class NameListService extends Analytics { - - constructor( - public analytics: AnalyticsService, - private store: Store, - private http: Http - ) { - super(analytics); - this.category = CATEGORY; - } - - getNames(): Observable> { - return this.http.get(`${Config.IS_MOBILE_NATIVE() ? '/' : ''}assets/data.json`) - .map(res => res.json()); - } -} diff --git a/electron/src/app/shared/sample/states/index.ts b/electron/src/app/shared/sample/states/index.ts deleted file mode 100644 index e259ba00d..000000000 --- a/electron/src/app/shared/sample/states/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './name-list.state'; diff --git a/electron/src/app/shared/sample/states/name-list.state.ts b/electron/src/app/shared/sample/states/name-list.state.ts deleted file mode 100644 index 3bcc2a9db..000000000 --- a/electron/src/app/shared/sample/states/name-list.state.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Observable } from 'rxjs/Observable'; - -export interface ISampleState { - names: Array; -} - -export const initialState: ISampleState = { - names: >[] -}; - -export function getNames(state$: Observable) { - return state$.select(state => state.names); -} diff --git a/electron/src/assets/data.json b/electron/src/assets/data.json new file mode 100644 index 000000000..d371e9ce9 --- /dev/null +++ b/electron/src/assets/data.json @@ -0,0 +1,6 @@ +[ + "Edsger Dijkstra", + "Donald Knuth", + "Alan Turing", + "Grace Hopper" +] diff --git a/electron/src/assets/favicon/favicon-DEV.ico b/electron/src/assets/favicon/favicon-DEV.ico new file mode 100644 index 0000000000000000000000000000000000000000..2b6c8f0a9ad7bec10cb914d84cb941d36fa5f0b7 GIT binary patch literal 1150 zcmchVzb^z)5XVO%3gl+o1rf!GiqhXfsg;PhbGi4FYAUV2LZR^^;tHA#Zr^rSYE(o- zq7YGNWX*e*NhTY6Ps47$`<seJzg(Lhz1gZRGPmO_z504;=~(JTFY>yc zw5XmLd z&W7h3eAJx8F+Mfe2)xA$VYCn8yUofx*I#^3YH?L_5^H{sS3YS^j$IpE;{U(TdJA=f z9qBK+@MX?3&aavil_Dqin)Cb5`|{4ZJnW&)v literal 0 HcmV?d00001 diff --git a/electron/src/assets/i18n/bg.json b/electron/src/assets/i18n/bg.json new file mode 100644 index 000000000..60d246079 --- /dev/null +++ b/electron/src/assets/i18n/bg.json @@ -0,0 +1,11 @@ +{ + "HOME": "у дома", + "ABOUT": "около", + "HELLO": "Здравей", + "LOVE_TECH": "Обичам технологиите!", + "ABOUT_ADD": "Искаш повече? Добавете ги себе си!", + "ABOUT_REWARD": "За награда, тук е списък на страхотни компютърни специалисти:", + "INPUT_HINT": "Въвеждане на нов компютърен специалист...", + "ADD_BTN_TEXT": "Добави", + "SUCCESS_MSG": "Вашият разполагане на ъгловото Seed Advanced работи перфектно." +} diff --git a/electron/src/assets/i18n/en.json b/electron/src/assets/i18n/en.json new file mode 100644 index 000000000..97814db05 --- /dev/null +++ b/electron/src/assets/i18n/en.json @@ -0,0 +1,11 @@ +{ + "HOME": "Home", + "ABOUT": "About", + "HELLO": "Hello", + "LOVE_TECH": "I love technology!", + "ABOUT_ADD": "You want more? Add them yourself!", + "ABOUT_REWARD": "For reward, here is a list of awesome computer scientists:", + "INPUT_HINT": "Enter a new computer scientist...", + "ADD_BTN_TEXT": "Add", + "SUCCESS_MSG": "Your deployment of Angular Seed Advanced worked perfectly." +} diff --git a/electron/src/assets/i18n/es.json b/electron/src/assets/i18n/es.json new file mode 100644 index 000000000..37e890520 --- /dev/null +++ b/electron/src/assets/i18n/es.json @@ -0,0 +1,11 @@ +{ + "HOME": "Casa", + "ABOUT": "Acerca de", + "HELLO": "Hola", + "LOVE_TECH": "Me encanta la tecnología!", + "ABOUT_ADD": "¿Quieres más? Añadir a ti mismo!", + "ABOUT_REWARD": "Para recompensa, aquí hay una lista de científicos informáticos impresionantes:", + "INPUT_HINT": "Introduzca un nuevo científico de la computación...", + "ADD_BTN_TEXT": "Añadir", + "SUCCESS_MSG": "Su despliegue de Angular avanzada Semilla funcionó a la perfección." +} diff --git a/electron/src/assets/i18n/fr.json b/electron/src/assets/i18n/fr.json new file mode 100644 index 000000000..8d72aa98e --- /dev/null +++ b/electron/src/assets/i18n/fr.json @@ -0,0 +1,11 @@ +{ + "HOME": "Accueil", + "ABOUT": "À propos", + "HELLO": "Bonjour", + "LOVE_TECH": "J'adore la technologie !", + "ABOUT_ADD": "Vous en voulez plus? Ajoutez-les vous-même !", + "ABOUT_REWARD": "En récompense, voici une liste de géniaux informaticiens :", + "INPUT_HINT": "Ajouter un nouvel informaticien...", + "ADD_BTN_TEXT": "Ajouter", + "SUCCESS_MSG": "Votre déploiement d'Angular Seed Advanced a parfaitement fonctionné." +} diff --git a/electron/src/assets/i18n/ru.json b/electron/src/assets/i18n/ru.json new file mode 100644 index 000000000..433ec6b3c --- /dev/null +++ b/electron/src/assets/i18n/ru.json @@ -0,0 +1,11 @@ +{ + "HOME": "Главная", + "ABOUT": "Справка", + "HELLO": "Здравствуйте", + "LOVE_TECH": "Я люблю технологию!", + "ABOUT_ADD": "Хочешь больше? Добавь их самостоятельно!", + "ABOUT_REWARD": "В награду, вот список классных компьютерных ученых:", + "INPUT_HINT": "Введите нового ученого...", + "ADD_BTN_TEXT": "Добавить", + "SUCCESS_MSG": "Ваш Angular Seed Advanced развернут отлично." +} diff --git a/electron/src/assets/logo.icns b/electron/src/assets/logo.icns new file mode 100644 index 0000000000000000000000000000000000000000..983a10d3e32d6a50f5e69c9ff07b77eca867c347 GIT binary patch literal 121052 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 Kx9U6k?tcMa$$aeq literal 0 HcmV?d00001 diff --git a/electron/src/assets/svg/more.svg b/electron/src/assets/svg/more.svg new file mode 100644 index 000000000..1b6b1dd01 --- /dev/null +++ b/electron/src/assets/svg/more.svg @@ -0,0 +1,7 @@ + + + diff --git a/electron/src/assets/svg/smile.svg b/electron/src/assets/svg/smile.svg new file mode 100644 index 000000000..368c12e4c --- /dev/null +++ b/electron/src/assets/svg/smile.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + emoticon + emote + smiley + happy + :) + :-) + + + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nativescript/src/App_Resources/Android/drawable-hdpi/icon.png b/nativescript/src/App_Resources/Android/drawable-hdpi/icon.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/Android/drawable-ldpi/icon.png b/nativescript/src/App_Resources/Android/drawable-ldpi/icon.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/Android/drawable-mdpi/icon.png b/nativescript/src/App_Resources/Android/drawable-mdpi/icon.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50.png b/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png b/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57.png b/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57@2x.png b/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57@2x.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72.png b/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72.png old mode 100755 new mode 100644 diff --git a/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png b/nativescript/src/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png old mode 100755 new mode 100644 diff --git a/src/client/app/components/about/about.component.html b/src/client/app/components/about/about.component.html old mode 100755 new mode 100644 diff --git a/src/client/app/components/app.component.html b/src/client/app/components/app.component.html old mode 100755 new mode 100644 diff --git a/src/client/app/components/home/home.component.html b/src/client/app/components/home/home.component.html old mode 100755 new mode 100644 diff --git a/src/client/app/components/home/home.component.scss b/src/client/app/components/home/home.component.scss old mode 100755 new mode 100644 diff --git a/tools/tasks/seed/build.assets.elec.ts b/tools/tasks/seed/build.assets.elec.ts index 3af398181..43a3a24e7 100644 --- a/tools/tasks/seed/build.assets.elec.ts +++ b/tools/tasks/seed/build.assets.elec.ts @@ -7,7 +7,7 @@ import { AssetsTask } from '../assets_task'; import Config from '../../config'; function copyFiles(paths: string[], subdir: string) { - const dest = join(Config.ELECTRON_APP_DEST, subdir); + const dest = join(Config.ELECTRON_APP_SRC, subdir); return gulp.src(paths) .pipe(newer(dest)) @@ -23,14 +23,6 @@ function copyAssets() { return copyFiles(paths, 'assets'); } -function copyAppResources() { - const paths: string[] = [ - join(Config.ELECTRON_APP_SRC, 'App_Resources', '**'), - ]; - - return copyFiles(paths, 'App_Resources'); -} - function copyAppFonts() { const paths: string[] = [ join(Config.ELECTRON_APP_SRC, 'fonts', '**', '*.otf'), @@ -45,7 +37,6 @@ export = run() { return merge( copyAssets(), - copyAppResources(), copyAppFonts(), copyFiles([join(Config.ELECTRON_APP_SRC, 'package.json')], ''), ); From 0a94b2a2bbee381786d887c4f44fc65b76fc729e Mon Sep 17 00:00:00 2001 From: ianm Date: Thu, 30 Mar 2017 10:22:17 -0400 Subject: [PATCH 08/17] webpack building electron app needs css/sass support helper --- electron/package.json | 38 +++++++++++-------- electron/src/package.json | 5 +++ electron/tools/{ => electron}/package.js | 0 electron/tools/webpack/helpers.js | 3 +- electron/webpack.config.js | 9 +++-- .../app/components/about/about.component.ts | 2 +- .../app/components/home/home.component.ts | 2 +- .../components/lang-switcher.component.ts | 2 +- ...ar.component.css => navbar.component.scss} | 0 .../sample/components/navbar.component.ts | 2 +- ...r.component.css => toolbar.component.scss} | 0 .../sample/components/toolbar.component.ts | 2 +- tools/tasks/seed/build.elec_html_css.ts | 2 +- tools/tasks/seed/build.js.elec.ts | 11 +++--- tools/tasks/seed/build.tns_html_css.ts | 2 +- 15 files changed, 48 insertions(+), 32 deletions(-) create mode 100644 electron/src/package.json rename electron/tools/{ => electron}/package.js (100%) rename src/client/app/shared/sample/components/{navbar.component.css => navbar.component.scss} (100%) rename src/client/app/shared/sample/components/{toolbar.component.css => toolbar.component.scss} (100%) diff --git a/electron/package.json b/electron/package.json index 474a511c5..7ce6513e2 100644 --- a/electron/package.json +++ b/electron/package.json @@ -15,25 +15,33 @@ "test": "karma start" }, "dependencies": { - "@angular/common": "^2.4.2", - "@angular/compiler": "^2.4.2", - "@angular/core": "^2.4.2", - "@angular/forms": "^2.4.2", - "@angular/http": "^2.4.2", - "@angular/platform-browser": "^2.4.2", - "@angular/platform-browser-dynamic": "^2.4.2", - "@angular/platform-server": "^2.4.2", - "@angular/router": "^3.4.2", + "@angular/common": "~2.4.0", + "@angular/compiler": "~2.4.0", + "@angular/core": "~2.4.0", + "@angular/forms": "~2.4.0", + "@angular/http": "~2.4.0", + "@angular/platform-browser": "~2.4.0", + "@angular/platform-browser-dynamic": "~2.4.0", + "@angular/router": "~3.4.1", "@ngrx/core": "^1.2.0", + "@ngrx/effects": "^2.0.0", "@ngrx/store": "^2.2.1", - "copy-webpack-plugin": "^4.0.1", + "@ngx-translate/core": "^6.0.0", + "@ngx-translate/http-loader": "0.0.3", + "angulartics2": "^1.6.4", "core-js": "^2.4.1", + "es-module-loader": "^1.0.0", + "intl": "^1.2.5", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "reflect-metadata": "^0.1.8", + "rxjs": "~5.0.3", + "systemjs": "0.19.41", + "zone.js": "^0.7.2", "electron": "^1.6.2", "electron-settings": "^2.2.2", "es6-promise": "^4.1.0", - "rxjs": "^5.0.0-rc.1", - "webpack-target-electron-renderer": "^0.4.0", - "zone.js": "^0.7.2" + "webpack-target-electron-renderer": "^0.4.0" }, "devDependencies": { "@types/electron": "^1.4.35", @@ -80,9 +88,9 @@ "svg-url-loader": "^2.0.0", "ts-helpers": "^1.1.1", "tsconfig-lint": "^0.12.0", - "tslint": "^4.0.2", + "tslint": "^4.3.2", "tslint-loader": "^3.2.0", - "typescript": "~2.1.5", + "typescript": "^2.1.4", "url-loader": "^0.5.7", "webpack": "^2.2.1", "webpack-dev-middleware": "^1.10.1", diff --git a/electron/src/package.json b/electron/src/package.json new file mode 100644 index 000000000..102631975 --- /dev/null +++ b/electron/src/package.json @@ -0,0 +1,5 @@ +{ + "name": "angular-seed-advanced", + "version": "1.0.0", + "main": "main.desktop.js" +} diff --git a/electron/tools/package.js b/electron/tools/electron/package.js similarity index 100% rename from electron/tools/package.js rename to electron/tools/electron/package.js diff --git a/electron/tools/webpack/helpers.js b/electron/tools/webpack/helpers.js index b62f83f56..ded448d1c 100644 --- a/electron/tools/webpack/helpers.js +++ b/electron/tools/webpack/helpers.js @@ -14,7 +14,8 @@ function gzipMaxLevel(buffer, callback) { function root(args) { args = Array.prototype.slice.call(arguments, 0); - return path.join.apply(path, [__dirname].concat(args)); + console.log(path.join.apply(path, [__dirname].concat(args))); + return path.join.apply(path, [__dirname,'../../../'].concat(args)); } function rootNode(args) { diff --git a/electron/webpack.config.js b/electron/webpack.config.js index 7f04b28f6..18cbf68c3 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -25,7 +25,7 @@ var config = { // Config for our build files output: { - path: helpers.root('src/app/dist'), + path: helpers.root('./dist'), filename: '[name].js', sourceMapFilename: '[name].map', chunkFilename: '[id].chunk.js' @@ -131,9 +131,10 @@ var config = { from: 'src/assets/*/**', to: 'assets' },{ - from: 'fonts/*/**', - to: 'fonts' - }]), + from: 'src/package.json', + to: '.' + } + ]), /** * Plugin LoaderOptionsPlugin (experimental) * diff --git a/src/client/app/components/about/about.component.ts b/src/client/app/components/about/about.component.ts index a0991104c..56f3e9707 100644 --- a/src/client/app/components/about/about.component.ts +++ b/src/client/app/components/about/about.component.ts @@ -6,7 +6,7 @@ import { Config } from '../../shared/core/index'; selector: 'sd-about', templateUrl: 'about.component.html', styleUrls: [ - 'about.component.css', + 'about.component.scss', ], }) export class AboutComponent { diff --git a/src/client/app/components/home/home.component.ts b/src/client/app/components/home/home.component.ts index 04c8d5878..d577939e6 100644 --- a/src/client/app/components/home/home.component.ts +++ b/src/client/app/components/home/home.component.ts @@ -12,7 +12,7 @@ import * as nameList from '../../shared/sample/index'; moduleId: module.id, selector: 'sd-home', templateUrl: 'home.component.html', - styleUrls: ['home.component.css'] + styleUrls: ['home.component.scss'] }) export class HomeComponent implements OnInit { public names$: Observable; diff --git a/src/client/app/shared/i18n/components/lang-switcher.component.ts b/src/client/app/shared/i18n/components/lang-switcher.component.ts index 95ad4f1ee..1bf725f73 100644 --- a/src/client/app/shared/i18n/components/lang-switcher.component.ts +++ b/src/client/app/shared/i18n/components/lang-switcher.component.ts @@ -13,7 +13,7 @@ import * as multilingual from '../index'; moduleId: module.id, selector: 'lang-switcher', templateUrl: 'lang-switcher.component.html', - styleUrls: ['lang-switcher.component.css'], + styleUrls: ['lang-switcher.component.scss'], }) export class LangSwitcherComponent { diff --git a/src/client/app/shared/sample/components/navbar.component.css b/src/client/app/shared/sample/components/navbar.component.scss similarity index 100% rename from src/client/app/shared/sample/components/navbar.component.css rename to src/client/app/shared/sample/components/navbar.component.scss diff --git a/src/client/app/shared/sample/components/navbar.component.ts b/src/client/app/shared/sample/components/navbar.component.ts index bee4e5c8d..99ea54565 100644 --- a/src/client/app/shared/sample/components/navbar.component.ts +++ b/src/client/app/shared/sample/components/navbar.component.ts @@ -6,7 +6,7 @@ import { Component } from '@angular/core'; selector: 'sd-navbar', templateUrl: 'navbar.component.html', styleUrls: [ - 'navbar.component.css', + 'navbar.component.scss', ], }) export class NavbarComponent { diff --git a/src/client/app/shared/sample/components/toolbar.component.css b/src/client/app/shared/sample/components/toolbar.component.scss similarity index 100% rename from src/client/app/shared/sample/components/toolbar.component.css rename to src/client/app/shared/sample/components/toolbar.component.scss diff --git a/src/client/app/shared/sample/components/toolbar.component.ts b/src/client/app/shared/sample/components/toolbar.component.ts index 45b2391de..af4be871e 100644 --- a/src/client/app/shared/sample/components/toolbar.component.ts +++ b/src/client/app/shared/sample/components/toolbar.component.ts @@ -8,7 +8,7 @@ import { LogService } from '../../core/index'; selector: 'sd-toolbar', templateUrl: 'toolbar.component.html', styleUrls: [ - 'toolbar.component.css', + 'toolbar.component.scss', ], }) export class ToolbarComponent { diff --git a/tools/tasks/seed/build.elec_html_css.ts b/tools/tasks/seed/build.elec_html_css.ts index 710475dd1..e6ce28413 100644 --- a/tools/tasks/seed/build.elec_html_css.ts +++ b/tools/tasks/seed/build.elec_html_css.ts @@ -51,7 +51,7 @@ function processComponentCss() { cwd: Config.ELECTRON_APP_SRC, }) .pipe(renamer()) - .on('error', reportPostCssError) + //.on('error', reportPostCssError) .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); } diff --git a/tools/tasks/seed/build.js.elec.ts b/tools/tasks/seed/build.js.elec.ts index b0ee52a41..269d10b9e 100644 --- a/tools/tasks/seed/build.js.elec.ts +++ b/tools/tasks/seed/build.js.elec.ts @@ -12,12 +12,14 @@ const plugins = gulpLoadPlugins(); const jsonSystemConfig = JSON.stringify(Config.ELECTRON_CONFIG); +//needs function for handling electron specific components/services. + /** * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development * environment. */ export = - class BuildJsDev extends TypeScriptTask { + class BuildJsElec extends TypeScriptTask { run() { const src = [ '**/*.ts', @@ -36,9 +38,9 @@ export = ...src, '!**/*.aot.ts', ], { - base: Config.ELECTRON_APP_SRC, - cwd: Config.ELECTRON_APP_SRC, - }) + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) .pipe(plugins.sourcemaps.init()) .pipe(tsProject()); @@ -67,7 +69,6 @@ export = .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); fs.writeFileSync(path.join(Config.ELECTRON_APP_DEST, 'build-config.json'), JSON.stringify(template)); - return merge(transpiled, copy); } }; diff --git a/tools/tasks/seed/build.tns_html_css.ts b/tools/tasks/seed/build.tns_html_css.ts index c695cd7f5..c1460a04f 100644 --- a/tools/tasks/seed/build.tns_html_css.ts +++ b/tools/tasks/seed/build.tns_html_css.ts @@ -48,7 +48,7 @@ function processComponentCss() { cwd: Config.TNS_APP_SRC, }) .pipe(renamer()) - .on('error', reportPostCssError) + //.on('error', reportPostCssError) // Causes Property 'pipe' does not exist on type 'EventEmitter'. .pipe(gulp.dest(Config.TNS_APP_DEST)); } From cdbdd8fd24b9f2ad47de790116287f85146897ed Mon Sep 17 00:00:00 2001 From: ianm Date: Thu, 30 Mar 2017 21:17:45 -0400 Subject: [PATCH 09/17] cleanup & webpack refactor --- .gitignore | 1 + electron/package.json | 38 ++- electron/src/app.desktop.scss | 0 electron/src/main.desktop.ts | 270 ----------------- electron/tools/webpack/helpers.js | 41 --- electron/webpack.config.js | 190 +----------- electron/webpack.test.js | 277 ------------------ electron/webpack/config/helpers.ts | 20 ++ electron/webpack/config/webpack.common.ts | 0 electron/webpack/config/webpack.dev.ts | 0 electron/webpack/config/webpack.prod.ts | 0 electron/webpack/config/webpack.test.ts | 0 .../app/components/about/about.component.ts | 2 +- .../app/components/home/home.component.ts | 2 +- .../components/lang-switcher.component.ts | 2 +- tools/tasks/seed/build.elec.config.ts | 71 +++++ tools/tasks/seed/build.elec_html_css.ts | 95 ------ tools/tasks/seed/build.js.elec.ts | 74 ----- 18 files changed, 140 insertions(+), 943 deletions(-) create mode 100644 electron/src/app.desktop.scss delete mode 100644 electron/src/main.desktop.ts delete mode 100644 electron/tools/webpack/helpers.js delete mode 100644 electron/webpack.test.js create mode 100644 electron/webpack/config/helpers.ts create mode 100644 electron/webpack/config/webpack.common.ts create mode 100644 electron/webpack/config/webpack.dev.ts create mode 100644 electron/webpack/config/webpack.prod.ts create mode 100644 electron/webpack/config/webpack.test.ts create mode 100644 tools/tasks/seed/build.elec.config.ts delete mode 100644 tools/tasks/seed/build.elec_html_css.ts delete mode 100644 tools/tasks/seed/build.js.elec.ts diff --git a/.gitignore b/.gitignore index a73c71a49..1075883f9 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ nativescript/src/**/*.js.map nativescript/*.d.ts !nativescript/src/references.d.ts electron/app +electron/config electron/node_modules electron/platforms electron/src/app diff --git a/electron/package.json b/electron/package.json index 7ce6513e2..64a9f26e6 100644 --- a/electron/package.json +++ b/electron/package.json @@ -15,7 +15,7 @@ "test": "karma start" }, "dependencies": { - "@angular/common": "~2.4.0", + "@angular/common": "~2.4.0", "@angular/compiler": "~2.4.0", "@angular/core": "~2.4.0", "@angular/forms": "~2.4.0", @@ -30,29 +30,51 @@ "@ngx-translate/http-loader": "0.0.3", "angulartics2": "^1.6.4", "core-js": "^2.4.1", + "css-loader": "^0.26.4", + "electron": "^1.6.2", + "electron-settings": "^2.2.2", "es-module-loader": "^1.0.0", + "es6-promise": "^4.1.0", "intl": "^1.2.5", "lodash": "^4.17.4", "minimatch": "^3.0.3", "reflect-metadata": "^0.1.8", "rxjs": "~5.0.3", "systemjs": "0.19.41", - "zone.js": "^0.7.2", - "electron": "^1.6.2", - "electron-settings": "^2.2.2", - "es6-promise": "^4.1.0", - "webpack-target-electron-renderer": "^0.4.0" + "webpack-target-electron-renderer": "^0.4.0", + "zone.js": "^0.7.2" }, "devDependencies": { "@types/electron": "^1.4.35", "@types/hammerjs": "^2.0.33", - "@types/jasmine": "^2.2.34", "@types/moment-timezone": "^0.2.32", "@types/mongodb": "^2.1.41", - "@types/node": "^7.0.1", "@types/source-map": "^0.5.0", "@types/uglify-js": "^2.0.27", "@types/webpack": "^2.0.0", + "@angular/compiler-cli": "~2.4.0", + "@angular/platform-server": "~2.4.0", + "@ngrx/store-devtools": "^3.2.2", + "@types/async": "^2.0.32", + "@types/browser-sync": "^0.0.34", + "@types/express": "^4.0.33", + "@types/gulp": "^3.8.32", + "@types/gulp-filter": "^3.0.29", + "@types/gulp-load-plugins": "^0.0.28", + "@types/gulp-newer": "0.0.29", + "@types/gulp-protractor": "^1.0.29", + "@types/gulp-rename": "0.0.31", + "@types/gulp-sass": "^0.0.29", + "@types/gulp-util": "^3.0.29", + "@types/jasmine": "^2.5.35", + "@types/lodash": "^4.14.37", + "@types/node": "^6.0.45", + "@types/rimraf": "0.0.28", + "@types/run-sequence": "^0.0.28", + "@types/selenium-webdriver": "^2.53.39", + "@types/systemjs": "^0.19.31", + "@types/yargs": "^6.5.0", + "@types/zone.js": "^0.0.27", "angular2-template-loader": "^0.6.0", "awesome-typescript-loader": "^3.0.8", "codelyzer": "^2.0.0-beta.2", diff --git a/electron/src/app.desktop.scss b/electron/src/app.desktop.scss new file mode 100644 index 000000000..e69de29bb diff --git a/electron/src/main.desktop.ts b/electron/src/main.desktop.ts deleted file mode 100644 index 9a16ad174..000000000 --- a/electron/src/main.desktop.ts +++ /dev/null @@ -1,270 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'production'; -console.log(`Electron launching with NODE_ENV: ${process.env.NODE_ENV}`); - -// electron -const electron = require('electron'); -const app = electron.app; -const Menu: any = electron.Menu; -const shell: any = electron.shell; -// const {crashReporter} = require('electron'); -const BrowserWindow = electron.BrowserWindow; -let mainWindow: any = null; -let template: any; -let menu: any; - -// app -import { DesktopConfig } from './app/shared/electron/index'; - -// Sample -// You would need a valid `submitURL` to use -// crashReporter.start({ -// productName: 'AngularSeedAdvanced', -// companyName: 'NathanWalker', -// submitURL: 'https://github.com/NathanWalker/angular-seed-advanced', -// autoSubmit: true -// }); - -if (process.env.NODE_ENV === 'development') { - require('electron-debug')(); -} - -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('ready', () => { - - // Initialize the window to our specified dimensions - mainWindow = new BrowserWindow({ width: 900, height: 620 }); - - // Tell Electron where to load the entry point from - mainWindow.loadURL('file://' + __dirname + '/index.html'); - - // Clear out the main window when the app is closed - mainWindow.on('closed', () => { - mainWindow = null; - }); - - mainWindow.webContents.on('did-navigate-in-page', (e: any, url: string) => { - console.log(`Page navigated: ${url}`); - }); - - let appTitle: string = `Angular Seed Advanced`; - - let langMenu: any = { - label: 'Language', - submenu: [] - }; - for (var lang of DesktopConfig.SUPPORTED_LANGUAGES) { - let code = lang.code; - let langOption = { - label: lang.title, - click:() => { - console.log(`Change lang: ${code}`); - mainWindow.webContents.executeJavaScript(`window.dispatchEvent(new CustomEvent('changeLang', {detail: { value: '${code}'} }));`); - } - }; - langMenu.submenu.push(langOption); - } - - let helpMenu: any = { - label: 'Help', - submenu: [{ - label: 'Learn More', - click:() => { - shell.openExternal('https://github.com/NathanWalker/angular-seed-advanced'); - } - }, { - label: 'Issues', - click:() => { - shell.openExternal('https://github.com/NathanWalker/angular-seed-advanced/issues'); - } - }, { - label: `My Amazing Parent: Minko Gechev's Angular Seed`, - click:() => { - shell.openExternal('https://github.com/mgechev/angular-seed'); - } - }, { - label: 'Angular 2', - click:() => { - shell.openExternal('https://angular.io/'); - } - }, { - label: 'Electron', - click:() => { - shell.openExternal('http://electron.atom.io/'); - } - }, { - label: 'Electron Docs', - click: () => { - shell.openExternal('https://github.com/atom/electron/tree/master/docs'); - } - }, { - label: 'Codeology Visualization', - click:() => { - shell.openExternal('http://codeology.braintreepayments.com/nathanwalker/angular-seed-advanced'); - } - }] - }; - - if (process.platform === 'darwin') { - template = [{ - label: appTitle, - submenu: [{ - label: `About ${appTitle}`, - selector: 'orderFrontStandardAboutPanel:' - }, { - type: 'separator' - }, { - label: 'Services', - submenu: [] - }, { - type: 'separator' - }, { - label: 'Hide Angular Seed Advanced', - accelerator: 'Command+H', - selector: 'hide:' - }, { - label: 'Hide Others', - accelerator: 'Command+Shift+H', - selector: 'hideOtherApplications:' - }, { - label: 'Show All', - selector: 'unhideAllApplications:' - }, { - type: 'separator' - }, { - label: 'Quit', - accelerator: 'Command+Q', - click:() => { - app.quit(); - } - }] - }, { - label: 'Edit', - submenu: [{ - label: 'Undo', - accelerator: 'Command+Z', - selector: 'undo:' - }, { - label: 'Redo', - accelerator: 'Shift+Command+Z', - selector: 'redo:' - }, { - type: 'separator' - }, { - label: 'Cut', - accelerator: 'Command+X', - selector: 'cut:' - }, { - label: 'Copy', - accelerator: 'Command+C', - selector: 'copy:' - }, { - label: 'Paste', - accelerator: 'Command+V', - selector: 'paste:' - }, { - label: 'Select All', - accelerator: 'Command+A', - selector: 'selectAll:' - }] - }, { - label: 'View', - submenu: (process.env.NODE_ENV === 'development') ? [{ - label: 'Reload', - accelerator: 'Command+R', - click:() => { - mainWindow.reload(); - } - }, { - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click:() => { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }, { - label: 'Toggle Developer Tools', - accelerator: 'Alt+Command+I', - click:() => { - mainWindow.toggleDevTools(); - } - }] : [{ - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click:() => { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }] - }, { - label: 'Window', - submenu: [{ - label: 'Minimize', - accelerator: 'Command+M', - selector: 'performMiniaturize:' - }, { - label: 'Close', - accelerator: 'Command+W', - selector: 'performClose:' - }, { - type: 'separator' - }, { - label: 'Bring All to Front', - selector: 'arrangeInFront:' - }] - }, - langMenu, - helpMenu]; - - menu = Menu.buildFromTemplate(template); - Menu.setApplicationMenu(menu); - } else { - template = [{ - label: '&File', - submenu: [{ - label: '&Open', - accelerator: 'Ctrl+O' - }, { - label: '&Close', - accelerator: 'Ctrl+W', - click:() => { - mainWindow.close(); - } - }] - }, { - label: '&View', - submenu: (process.env.NODE_ENV === 'development') ? [{ - label: '&Reload', - accelerator: 'Ctrl+R', - click:() => { - mainWindow.reload(); - } - }, { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click:() => { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }, { - label: 'Toggle &Developer Tools', - accelerator: 'Alt+Ctrl+I', - click:() => { - mainWindow.toggleDevTools(); - } - }] : [{ - label: 'Toggle &Full Screen', - accelerator: 'F11', - click:() => { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }] - }, - langMenu, - helpMenu]; - menu = Menu.buildFromTemplate(template); - mainWindow.setMenu(menu); - } - -}); diff --git a/electron/tools/webpack/helpers.js b/electron/tools/webpack/helpers.js deleted file mode 100644 index ded448d1c..000000000 --- a/electron/tools/webpack/helpers.js +++ /dev/null @@ -1,41 +0,0 @@ -var path = require('path'); -var zlib = require('zlib'); - - -// Helper functions - -function hasProcessFlag(flag) { - return process.argv.join('').indexOf(flag) > -1; -} - -function gzipMaxLevel(buffer, callback) { - return zlib['gzip'](buffer, {level: 9}, callback); -} - -function root(args) { - args = Array.prototype.slice.call(arguments, 0); - console.log(path.join.apply(path, [__dirname].concat(args))); - return path.join.apply(path, [__dirname,'../../../'].concat(args)); -} - -function rootNode(args) { - args = Array.prototype.slice.call(arguments, 0); - return root.apply(path, ['node_modules'].concat(args)); -} - -function prependExt(extensions, args) { - args = args || []; - if (!Array.isArray(args)) { args = [args] } - return extensions.reduce(function(memo, val) { - return memo.concat(val, args.map(function(prefix) { - return prefix + val; - })); - }, ['']); -} - -exports.hasProcessFlag = hasProcessFlag; -exports.gzipMaxLevel = gzipMaxLevel; -exports.root = root; -exports.rootNode = rootNode; -exports.prependExt = prependExt; -exports.prepend = prependExt; \ No newline at end of file diff --git a/electron/webpack.config.js b/electron/webpack.config.js index 18cbf68c3..1d1192747 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -1,175 +1,15 @@ -/* - * Helper: root(), and rootDir() are defined at the bottom - */ -const webpack = require('webpack'); -const helpers = require('./tools/webpack/helpers'); -const path = require('path'); - -var CopyWebpackPlugin = require('copy-webpack-plugin'); -const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); - -/* - * Config - */ -var config = { - // for faster builds use 'eval' - devtool: 'source-map', - // cache: false, - - // our angular app - entry: { - 'polyfills': './src/polyfills.ts', - 'vendor': './src/vendor.ts', - 'app': './src/app.ts', - }, - - // Config for our build files - output: { - path: helpers.root('./dist'), - filename: '[name].js', - sourceMapFilename: '[name].map', - chunkFilename: '[id].chunk.js' - }, - /* - * Options affecting the resolving of modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve - */ - resolve: { - /* - * An array of extensions that should be used to resolve modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve-extensions - */ - extensions: ['.ts', '.js', '.json', '.css', '.html'], - - // An array of directory names to be resolved to the current directory - modules: [helpers.root('src'), 'node_modules'], - - }, - /* - * Options affecting the resolving of modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve - */ - module: { - rules: [ - // Support for .ts files. - { - test: /\.ts$/, - loaders: ['awesome-typescript-loader', 'angular2-template-loader'], - exclude: [/\.(spec|e2e)\.ts$/] - }, - - // Support for *.json files. - { - test: /\.json$/, - loader: 'json-loader' - }, - /* - * Bootstrap 4 loader - */ - { - test: /bootstrap\/dist\/js\/umd\//, - use: 'imports-loader?jQuery=jquery' - }, - - { - test: /\.scss$/, - exclude: /node_modules/, - loaders: ['raw-loader', 'sass-loader'] // sass-loader not scss-loader - }, - - // support for .html antd .css as raw text - { - test: /\.html$/, - loader: 'raw-loader', - exclude: [helpers.root('app/index.html')] - }, - - // support for fonts - { - test: /\.(ttf|eot|svg|woff(2)?)(\?[a-z0-9=&.]+)?$/, - loader: 'file-loader?name=dist/[name]-[hash].[ext]' - }, - - // support for svg icons - { - test: /\.svg/, - loader: 'svg-url-loader' - } - ] - }, - plugins: [ - new webpack.IgnorePlugin(/vertx/), - - // Workaround for angular/angular#11580 - new webpack.ContextReplacementPlugin( - // The (\\|\/) piece accounts for path separators in *nix and Windows - /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/, - helpers.root('./src'), // location of your src - {} // a map of your routes - ), - - // Plugin: CommonsChunkPlugin - // Description: Shares common code between the pages. - // It identifies common modules and put them into a commons chunk. - // - // See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin - // See: https://github.com/webpack/docs/wiki/optimization#multi-page-app - new webpack.optimize.CommonsChunkPlugin({ - name: ['vendor', 'polyfills'], - minChunks: Infinity - }), - // Plugin: CopyWebpackPlugin - // Description: Copy files and directories in webpack. - // - // Copies project static assets. - // - // See: https://www.npmjs.com/package/copy-webpack-plugin - new CopyWebpackPlugin([{ - from: 'src/assets/*/**', - to: 'assets' - },{ - from: 'src/package.json', - to: '.' - } - ]), - /** - * Plugin LoaderOptionsPlugin (experimental) - * - * See: https://gist.github.com/sokra/27b24881210b56bbaff7 - */ - new LoaderOptionsPlugin({ - debug: true, - options: { - /** - * Static analysis linter for TypeScript advanced options configuration - * Description: An extensible linter for the TypeScript language. - * - * See: https://github.com/wbuchwalter/tslint-loader - */ - tslint: { - emitErrors: false, - failOnHint: false, - resourcePath: 'src' - }, - } - }), - ], - // we need this due to problems with es6-shim - node: { - global: true, - progress: false, - crypto: 'empty', - module: false, - clearImmediate: false, - setImmediate: false - } -}; - -/** - * Target Electron - */ -config.target = 'electron-renderer'; -module.exports = config; +//webpack config per environment set from seed start script +switch (process.env.NODE_ENV) { + case 'prod': + case 'production': + module.exports = require('./config/webpack.prod')({env: 'production'}); + break; + case 'test': + case 'testing': + module.exports = require('./config/webpack.test')({env: 'test'}); + break; + case 'dev': + case 'development': + default: + module.exports = require('./config/webpack.dev')({env: 'development'}); +} diff --git a/electron/webpack.test.js b/electron/webpack.test.js deleted file mode 100644 index 934e12af3..000000000 --- a/electron/webpack.test.js +++ /dev/null @@ -1,277 +0,0 @@ -const helpers = require('./tools/webpack/helpers'); - -/** - * Webpack Plugins - */ -const ProvidePlugin = require('webpack/lib/ProvidePlugin'); -const DefinePlugin = require('webpack/lib/DefinePlugin'); -var ExtractTextPlugin = require("extract-text-webpack-plugin"); - -/** - * Webpack Constants - */ -const ENV = process.env.ENV = process.env.NODE_ENV = 'test'; - -/** - * Webpack configuration - * - * See: http://webpack.github.io/docs/configuration.html#cli - */ -module.exports = { - - /** - * Source map for Karma from the help of karma-sourcemap-loader & karma-webpack - * - * Do not change, leave as is or it wont work. - * See: https://github.com/webpack/karma-webpack#source-maps - */ - devtool: 'inline-source-map', - - /** - * Options affecting the resolving of modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve - */ - resolve: { - - /** - * An array of extensions that should be used to resolve modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve-extensions - */ - extensions: ['', '.ts', '.js'], - - /** - * Make sure root is src - */ - root: helpers.root('src'), - - }, - - /** - * Options affecting the normal modules. - * - * See: http://webpack.github.io/docs/configuration.html#module - */ - module: { - - /** - * An array of applied pre and post loaders. - * - * See: http://webpack.github.io/docs/configuration.html#module-preloaders-module-postloaders - */ - preLoaders: [ - - /** - * Tslint loader support for *.ts files - * - * See: https://github.com/wbuchwalter/tslint-loader - */ - { - test: /\.ts$/, - loader: 'tslint-loader', - exclude: [helpers.root('node_modules')] - }, - - /** - * Source map loader support for *.js files - * Extracts SourceMaps for source files that as added as sourceMappingURL comment. - * - * See: https://github.com/webpack/source-map-loader - */ - { - test: /\.js$/, - loader: 'source-map-loader', - exclude: [ - // these packages have problems with their sourcemaps - helpers.root('node_modules/rxjs'), - helpers.root('node_modules/@angular') - ] - } - - ], - - /** - * An array of automatically applied loaders. - * - * IMPORTANT: The loaders here are resolved relative to the resource which they are applied to. - * This means they are not resolved relative to the configuration file. - * - * See: http://webpack.github.io/docs/configuration.html#module-loaders - */ - loaders: [ - - /** - * Typescript loader support for .ts and Angular 2 async routes via .async.ts - * - * See: https://github.com/s-panferov/awesome-typescript-loader - */ - { - test: /\.ts$/, - loader: 'awesome-typescript-loader', - query: { - compilerOptions: { - - // Remove TypeScript helpers to be injected - // below by DefinePlugin - removeComments: true - - } - }, - exclude: [/\.e2e\.ts$/] - }, - - // Support for *.json files. - { - test: /\.json$/, - loader: 'json-loader' - }, - - // Support for CSS as raw text - { - test: /\.css$/, - loader: 'raw-loader' - }, - - // support for .html as raw text - { - test: /\.html$/, - loader: 'raw-loader', - exclude: [helpers.root('app/index.html')] - }, - - // Support for CSS as raw text - { - test: /\.css$/, - loader: ExtractTextPlugin.extract(['css']) - }, - - // General sass should be included in a css file - { - test: /\.scss$/, - loader: ExtractTextPlugin.extract(['css', 'sass']), - exclude: [ - helpers.root('src/app/components'), - helpers.root('src/app/projects'), - helpers.root('src/app/home'), - helpers.root('src/app/shared'), - helpers.root('src/app/login'), - ] - }, - - // Component specific sass should be included in the component - { - test: /\.scss$/, - loaders: ["css", "sass"], - exclude: [helpers.root('src/app/sass')] - }, - - // Inline base64 URLs for <=8k images, direct URLs for the rest - { - test: /\.(png|jpg|jpeg)$/, - loader: 'url-loader?limit=10000' - }, - - // Font handeling - used in fontawesome and other fonts - , { - test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, - loader: "url?limit=10000&mimetype=application/font-woff" - }, { - test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, - loader: "url?limit=10000&mimetype=application/font-woff" - }, { - test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, - loader: "url?limit=10000&mimetype=application/octet-stream" - }, { - test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - loader: "file" - }, { - test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, - loader: "url?limit=10000&mimetype=image/svg+xml" - } - - ], - - /** - * An array of applied pre and post loaders. - * - * See: http://webpack.github.io/docs/configuration.html#module-preloaders-module-postloaders - */ - postLoaders: [ - - /** - * Instruments JS files with Istanbul for subsequent code coverage reporting. - * Instrument only testing sources. - * - * See: https://github.com/deepsweet/istanbul-instrumenter-loader - */ - { - test: /\.(js|ts)$/, loader: 'istanbul-instrumenter-loader', - include: helpers.root('src'), - exclude: [ - /\.(e2e|spec)\.ts$/, - /node_modules/ - ] - } - - ] - }, - - /** - * Add additional plugins to the compiler. - * - * See: http://webpack.github.io/docs/configuration.html#plugins - */ - plugins: [ - - /** - * Plugin: DefinePlugin - * Description: Define free variables. - * Useful for having development builds with debug logging or adding global constants. - * - * Environment helpers - * - * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin - */ - // NOTE: when adding more properties make sure you include them in custom-typings.d.ts - new DefinePlugin({ - 'ENV': JSON.stringify(ENV), - 'HMR': false, - 'process.env': { - 'ENV': JSON.stringify(ENV), - 'NODE_ENV': JSON.stringify(ENV), - 'HMR': false, - } - }), - - - ], - - /** - * Static analysis linter for TypeScript advanced options configuration - * Description: An extensible linter for the TypeScript language. - * - * See: https://github.com/wbuchwalter/tslint-loader - */ - tslint: { - emitErrors: false, - failOnHint: false, - resourcePath: 'src' - }, - - /** - * Include polyfills or mocks for various node stuff - * Description: Node configuration - * - * See: https://webpack.github.io/docs/configuration.html#node - */ - node: { - global: 'window', - process: false, - crypto: 'empty', - module: false, - clearImmediate: false, - setImmediate: false - } - -}; \ No newline at end of file diff --git a/electron/webpack/config/helpers.ts b/electron/webpack/config/helpers.ts new file mode 100644 index 000000000..6eb38186c --- /dev/null +++ b/electron/webpack/config/helpers.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; +import Config from '../../../tools/config'; + +const EVENT = process.env.npm_lifecycle_event || ''; +var ROOT = path.resolve(Config.ELECTRON_BASE_DIR); + +export function hasProcessFlag(flag) { + return process.argv.join('').indexOf(flag) > -1; +} + +export function hasNpmFlag(flag) { + return EVENT.includes(flag); +} + +export function isWebpackDevServer() { + return process.argv[1] && !! (/webpack-dev-server/.exec(process.argv[1])); +} + +export var root = path.join.bind(path, ROOT); + diff --git a/electron/webpack/config/webpack.common.ts b/electron/webpack/config/webpack.common.ts new file mode 100644 index 000000000..e69de29bb diff --git a/electron/webpack/config/webpack.dev.ts b/electron/webpack/config/webpack.dev.ts new file mode 100644 index 000000000..e69de29bb diff --git a/electron/webpack/config/webpack.prod.ts b/electron/webpack/config/webpack.prod.ts new file mode 100644 index 000000000..e69de29bb diff --git a/electron/webpack/config/webpack.test.ts b/electron/webpack/config/webpack.test.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/client/app/components/about/about.component.ts b/src/client/app/components/about/about.component.ts index 56f3e9707..a0991104c 100644 --- a/src/client/app/components/about/about.component.ts +++ b/src/client/app/components/about/about.component.ts @@ -6,7 +6,7 @@ import { Config } from '../../shared/core/index'; selector: 'sd-about', templateUrl: 'about.component.html', styleUrls: [ - 'about.component.scss', + 'about.component.css', ], }) export class AboutComponent { diff --git a/src/client/app/components/home/home.component.ts b/src/client/app/components/home/home.component.ts index d577939e6..04c8d5878 100644 --- a/src/client/app/components/home/home.component.ts +++ b/src/client/app/components/home/home.component.ts @@ -12,7 +12,7 @@ import * as nameList from '../../shared/sample/index'; moduleId: module.id, selector: 'sd-home', templateUrl: 'home.component.html', - styleUrls: ['home.component.scss'] + styleUrls: ['home.component.css'] }) export class HomeComponent implements OnInit { public names$: Observable; diff --git a/src/client/app/shared/i18n/components/lang-switcher.component.ts b/src/client/app/shared/i18n/components/lang-switcher.component.ts index 1bf725f73..95ad4f1ee 100644 --- a/src/client/app/shared/i18n/components/lang-switcher.component.ts +++ b/src/client/app/shared/i18n/components/lang-switcher.component.ts @@ -13,7 +13,7 @@ import * as multilingual from '../index'; moduleId: module.id, selector: 'lang-switcher', templateUrl: 'lang-switcher.component.html', - styleUrls: ['lang-switcher.component.scss'], + styleUrls: ['lang-switcher.component.css'], }) export class LangSwitcherComponent { diff --git a/tools/tasks/seed/build.elec.config.ts b/tools/tasks/seed/build.elec.config.ts new file mode 100644 index 000000000..349350129 --- /dev/null +++ b/tools/tasks/seed/build.elec.config.ts @@ -0,0 +1,71 @@ +import * as gulp from 'gulp'; +import * as gulpLoadPlugins from 'gulp-load-plugins'; +import * as merge from 'merge-stream'; +import * as util from 'gulp-util'; +import { join/*, sep, relative*/ } from 'path'; + +import Config from '../../config'; +import { makeTsProject, TemplateLocalsBuilder } from '../../utils'; +import { TypeScriptTask } from '../typescript_task'; + +const plugins = gulpLoadPlugins(); + +let typedBuildCounter = Config.TYPED_COMPILE_INTERVAL; // Always start with the typed build. + +/** + * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development + * environment. + */ +export = + class BuildElectronConfig extends TypeScriptTask { + run() { + let tsProject: any; + let typings = gulp.src([ + Config.TOOLS_DIR + '/manual_typings/**/*.d.ts' + ]); + let src = [ + join(Config.ELECTRON_BASE_DIR, 'webpack', '**/*.ts'), + ]; + + let projectFiles = gulp.src(src); + let result: any; + let isFullCompile = true; + + // Only do a typed build every X builds, otherwise do a typeless build to speed things up + if (typedBuildCounter < Config.TYPED_COMPILE_INTERVAL) { + isFullCompile = false; + tsProject = makeTsProject({ isolatedModules: true }); + projectFiles = projectFiles.pipe(plugins.cached()); + util.log('Performing typeless TypeScript compile.'); + } else { + tsProject = makeTsProject(); + projectFiles = merge(typings, projectFiles); + } + + result = projectFiles + .pipe(plugins.plumber()) + //.pipe(plugins.sourcemaps.init()) + .pipe(tsProject()) + .on('error', () => { + typedBuildCounter = Config.TYPED_COMPILE_INTERVAL; + }); + + if (isFullCompile) { + typedBuildCounter = 0; + } else { + typedBuildCounter++; + } + + return result.js + .pipe(plugins.sourcemaps.write()) + // Use for debugging with Webstorm/IntelliJ + // https://github.com/mgechev/angular-seed/issues/1220 + // .pipe(plugins.sourcemaps.write('.', { + // includeContent: false, + // sourceRoot: (file: any) => + // relative(file.path, Config.PROJECT_ROOT + '/' + Config.APP_SRC).replace(sep, '/') + '/' + Config.APP_SRC + // })) + .pipe(plugins.template(new TemplateLocalsBuilder().withStringifiedSystemConfigDev().build())) + .pipe(gulp.dest(Config.ELECTRON_BASE_DIR)); + } + }; diff --git a/tools/tasks/seed/build.elec_html_css.ts b/tools/tasks/seed/build.elec_html_css.ts deleted file mode 100644 index e6ce28413..000000000 --- a/tools/tasks/seed/build.elec_html_css.ts +++ /dev/null @@ -1,95 +0,0 @@ -import * as gulp from 'gulp'; -import * as gulpLoadPlugins from 'gulp-load-plugins'; -import * as merge from 'merge-stream'; -import * as util from 'gulp-util'; -import * as rename from 'gulp-rename'; - -import Config from '../../config'; -import { CssTask } from '../css_task'; - -const plugins = gulpLoadPlugins(); -const reportPostCssError = (e: any) => util.log(util.colors.red(e.message)); - -function renamer() { - return rename((path: any) => { - path.basename = path.basename.replace(/\.elec/, ''); - }); -} -/** - * For any electron only views '*.elec.html' - */ - -function prepareTemplates() { - return gulp.src([ - '**/*.html', - 'app/**/*.html', - '!app/**/*.component.html', - ], { - base: Config.ELECTRON_APP_SRC, - cwd: Config.ELECTRON_APP_SRC, - }) - .pipe(renamer()) - .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); -} - -function processComponentStylesheets() { - return Config.ENABLE_SCSS ? - merge( - processComponentScss(), - processComponentCss()) - : - processComponentCss(); -} - -function processComponentCss() { - return gulp.src([ - '**/*.css', - 'app/**/*.css', - '!app/**/*.component.css', - ], { - base: Config.ELECTRON_APP_SRC, - cwd: Config.ELECTRON_APP_SRC, - }) - .pipe(renamer()) - //.on('error', reportPostCssError) - .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); -} - -/** - * Process scss files referenced from Angular component `styleUrls` metadata - */ -function processComponentScss() { - const stream = gulp.src([ - '**/*.scss', - 'app/**/*.scss', - '!app/**/*.component.scss', - ], { - base: Config.ELECTRON_APP_SRC, - cwd: Config.ELECTRON_APP_SRC, - }) - .pipe(plugins.sourcemaps.init()) - .pipe(plugins.sass(Config.getPluginConfig('gulp-sass')).on('error', plugins.sass.logError)) - .pipe(plugins.sourcemaps.write()); - - return stream - .pipe(renamer()) - .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); -} - - -export = - class BuildElectronCSS extends CssTask { - shallRun(files: String[]) { - // Only run if tns-resources - return files.some((f) => - // tns.html, tns.scss or tns.css under nativescript/src/app - (f.indexOf('electron/src/app') !== -1 && !!f.match(/\.elec\.(s?css|html)$/)) || - // .html, .scss or .css NOT under nativescript/src/app - (f.indexOf('electron/src/app') === -1 && !!f.match(/\.(s?css|html)$/)) - ); - } - - run() { - return merge(processComponentStylesheets(), prepareTemplates()); - } - }; diff --git a/tools/tasks/seed/build.js.elec.ts b/tools/tasks/seed/build.js.elec.ts deleted file mode 100644 index 269d10b9e..000000000 --- a/tools/tasks/seed/build.js.elec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as gulp from 'gulp'; -import * as gulpLoadPlugins from 'gulp-load-plugins'; -import * as merge from 'merge-stream'; -import * as fs from 'fs'; -import * as path from 'path'; - -import Config from '../../config'; -import { makeTsProject, TemplateLocalsBuilder } from '../../utils'; -import { TypeScriptTask } from '../typescript_task'; - -const plugins = gulpLoadPlugins(); - -const jsonSystemConfig = JSON.stringify(Config.ELECTRON_CONFIG); - -//needs function for handling electron specific components/services. - -/** - * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development - * environment. - */ -export = - class BuildJsElec extends TypeScriptTask { - run() { - const src = [ - '**/*.ts', - 'app/**/*.ts', - '!**/*.spec.ts', - '!app/**/*.spec.ts', - '!**/*.e2e-spec.ts', - '!app/**/*.e2e-spec.ts', - '!app/shared/test/**/*', - `!**/${Config.NG_FACTORY_FILE}.ts`, - ]; - - const tsProject = makeTsProject({}, Config.ELECTRON_APP_SRC); - - const result = gulp.src([ - ...src, - '!**/*.aot.ts', - ], { - base: Config.ELECTRON_APP_SRC, - cwd: Config.ELECTRON_APP_SRC, - }) - .pipe(plugins.sourcemaps.init()) - .pipe(tsProject()); - - const template = (Object).assign( - new TemplateLocalsBuilder().withStringifiedSystemConfigDev().build(), { - SYSTEM_CONFIG_TNS: jsonSystemConfig - }, - ); - - const transpiled = result.js - .pipe(plugins.sourcemaps.write()) - // Use for debugging with Webstorm/IntelliJ - // https://github.com/mgechev/angular-seed/issues/1220 - // .pipe(plugins.sourcemaps.write('.', { - // includeContent: false, - // sourceRoot: (file: any) => - // relative(file.path, PROJECT_ROOT + '/' + APP_SRC).replace(sep, '/') + '/' + APP_SRC - // })) - .pipe(plugins.template(template)) - .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); - - const copy = gulp.src(src, { - base: Config.ELECTRON_APP_SRC, - cwd: Config.ELECTRON_APP_SRC, - }) - .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); - - fs.writeFileSync(path.join(Config.ELECTRON_APP_DEST, 'build-config.json'), JSON.stringify(template)); - return merge(transpiled, copy); - } - }; From 9c69ada14dfc08b2f6fc32e7c0d3493ebfa6a26e Mon Sep 17 00:00:00 2001 From: ianm Date: Thu, 30 Mar 2017 21:31:55 -0400 Subject: [PATCH 10/17] webpack common with seed config --- electron/webpack/config/webpack.common.ts | 256 ++++++++++++++++++++++ 1 file changed, 256 insertions(+) diff --git a/electron/webpack/config/webpack.common.ts b/electron/webpack/config/webpack.common.ts index e69de29bb..07bc74506 100644 --- a/electron/webpack/config/webpack.common.ts +++ b/electron/webpack/config/webpack.common.ts @@ -0,0 +1,256 @@ +import Config from '../../../tools/config'; +const helpers = require('./helpers'); +const webpackMerge = require('webpack-merge'); // used to merge webpack configs +const webpackMergeDll = webpackMerge.strategy({plugins: 'replace'}); +const commonConfig = require('./webpack.common.js'); // the settings that are common to prod and dev + +/** + * Webpack Plugins + */ +const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin'); +const DefinePlugin = require('webpack/lib/DefinePlugin'); +const NamedModulesPlugin = require('webpack/lib/NamedModulesPlugin'); +const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); + +/** + * Webpack Constants + */ +const ENV = process.env.ENV = process.env.NODE_ENV = 'development'; +const HOST = process.env.HOST || 'localhost'; +const PORT = process.env.PORT || 3000; +const HMR = helpers.hasProcessFlag('hot'); +const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, { + host: HOST, + port: PORT, + ENV: ENV, + HMR: HMR +}); + + +const DllBundlesPlugin = require('webpack-dll-bundles-plugin').DllBundlesPlugin; + +/** + * Webpack configuration + * + * See: http://webpack.github.io/docs/configuration.html#cli + */ +module.exports = function (options) { + return webpackMerge(commonConfig({env: Config.BUILD_TYPE}), { + + + /** + * Developer tool to enhance debugging + * + * See: http://webpack.github.io/docs/configuration.html#devtool + * See: https://github.com/webpack/docs/wiki/build-performance#sourcemaps + */ + devtool: 'cheap-module-source-map', + + /** + * Options affecting the output of the compilation. + * + * See: http://webpack.github.io/docs/configuration.html#output + */ + output: { + + /** + * The output directory as absolute path (required). + * + * See: http://webpack.github.io/docs/configuration.html#output-path + */ + path: helpers.root(Config.APP_DEST), + + /** + * Specifies the name of each output file on disk. + * IMPORTANT: You must not specify an absolute path here! + * + * See: http://webpack.github.io/docs/configuration.html#output-filename + */ + filename: '[name].bundle.js', + + /** + * The filename of the SourceMaps for the JavaScript files. + * They are inside the output.path directory. + * + * See: http://webpack.github.io/docs/configuration.html#output-sourcemapfilename + */ + sourceMapFilename: '[file].map', + + /** The filename of non-entry chunks as relative path + * inside the output.path directory. + * + * See: http://webpack.github.io/docs/configuration.html#output-chunkfilename + */ + chunkFilename: '[id].chunk.js', + + library: 'ac_[name]', + libraryTarget: 'var', + }, + + module: { + + rules: [ + { + test: /\.ts$/, + use: [ + { + loader: 'tslint-loader', + options: { + configFile: 'tslint.json' + } + } + ], + exclude: [/\.(spec|e2e)\.ts$/] + }, + + /* + * css loader support for *.css files (styles directory only) + * Loads external css styles into the DOM, supports HMR + * + */ + { + test: /\.css$/, + use: ['style-loader', 'css-loader'], + include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.css' )] + }, + + /* + * sass loader support for *.scss files (styles directory only) + * Loads external sass styles into the DOM, supports HMR + * + */ + { + test: /\.scss$/, + use: ['style-loader', 'css-loader', 'sass-loader'], + include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.scss')] + }, + + ] + + }, + + plugins: [ + + /** + * Plugin: DefinePlugin + * Description: Define free variables. + * Useful for having development builds with debug logging or adding global constants. + * + * Environment helpers + * + * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin + */ + // NOTE: when adding more properties, make sure you include them in custom-typings.d.ts + new DefinePlugin({ + 'ENV': JSON.stringify(METADATA.ENV), + 'HMR': METADATA.HMR, + 'process.env': { + 'ENV': JSON.stringify(METADATA.ENV), + 'NODE_ENV': JSON.stringify(METADATA.ENV), + 'HMR': METADATA.HMR, + } + }), + + new DllBundlesPlugin({ + bundles: { + polyfills: [ + 'core-js', + { + name: 'zone.js', + path: 'zone.js/dist/zone.js' + }, + { + name: 'zone.js', + path: 'zone.js/dist/long-stack-trace-zone.js' + }, + ], + vendor: [ + '@angular/platform-browser', + '@angular/platform-browser-dynamic', + '@angular/core', + '@angular/common', + '@angular/forms', + '@angular/http', + '@angular/router', + '@angularclass/hmr', + 'rxjs', + ] + }, + dllDir: helpers.root('dll'), + webpackConfig: webpackMergeDll(commonConfig({env: ENV}), { + devtool: 'cheap-module-source-map', + plugins: [] + }) + }), + + /** + * Plugin: AddAssetHtmlPlugin + * Description: Adds the given JS or CSS file to the files + * Webpack knows about, and put it into the list of assets + * html-webpack-plugin injects into the generated html. + * + * See: https://github.com/SimenB/add-asset-html-webpack-plugin + */ + new AddAssetHtmlPlugin([ + { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('polyfills')}`) }, + { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('vendor')}`) } + ]), + + /** + * Plugin: NamedModulesPlugin (experimental) + * Description: Uses file names as module name. + * + * See: https://github.com/webpack/webpack/commit/a04ffb928365b19feb75087c63f13cadfc08e1eb + */ + // new NamedModulesPlugin(), + + /** + * Plugin LoaderOptionsPlugin (experimental) + * + * See: https://gist.github.com/sokra/27b24881210b56bbaff7 + */ + new LoaderOptionsPlugin({ + debug: true, + options: { + + } + }), + + ], + + /** + * Webpack Development Server configuration + * Description: The webpack-dev-server is a little node.js Express server. + * The server emits information about the compilation state to the client, + * which reacts to those events. + * + * See: https://webpack.github.io/docs/webpack-dev-server.html + */ + devServer: { + port: METADATA.port, + host: METADATA.host, + historyApiFallback: true, + watchOptions: { + aggregateTimeout: 300, + poll: 1000 + } + }, + + /* + * Include polyfills or mocks for various node stuff + * Description: Node configuration + * + * See: https://webpack.github.io/docs/configuration.html#node + */ + node: { + global: true, + crypto: 'empty', + process: true, + module: false, + clearImmediate: false, + setImmediate: false + } + + }); +}; + From 27888e639b2a920a707d34aa312e6cb68c6b7d93 Mon Sep 17 00:00:00 2001 From: ianm Date: Thu, 30 Mar 2017 21:36:02 -0400 Subject: [PATCH 11/17] missed env var --- electron/webpack/config/webpack.common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electron/webpack/config/webpack.common.ts b/electron/webpack/config/webpack.common.ts index 07bc74506..f2901a223 100644 --- a/electron/webpack/config/webpack.common.ts +++ b/electron/webpack/config/webpack.common.ts @@ -19,7 +19,7 @@ const ENV = process.env.ENV = process.env.NODE_ENV = 'development'; const HOST = process.env.HOST || 'localhost'; const PORT = process.env.PORT || 3000; const HMR = helpers.hasProcessFlag('hot'); -const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, { +const METADATA = webpackMerge(commonConfig({env: Config.BUILD_TYPE}).metadata, { host: HOST, port: PORT, ENV: ENV, From 1eb7090d47bbb7a108afc96b3121a25985cca131 Mon Sep 17 00:00:00 2001 From: ianm Date: Thu, 30 Mar 2017 21:41:57 -0400 Subject: [PATCH 12/17] env correction & dev wabpack config --- electron/webpack/config/webpack.common.ts | 6 +- electron/webpack/config/webpack.dev.ts | 254 ++++++++++++++++++++++ 2 files changed, 257 insertions(+), 3 deletions(-) diff --git a/electron/webpack/config/webpack.common.ts b/electron/webpack/config/webpack.common.ts index f2901a223..1b250033b 100644 --- a/electron/webpack/config/webpack.common.ts +++ b/electron/webpack/config/webpack.common.ts @@ -15,11 +15,11 @@ const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); /** * Webpack Constants */ -const ENV = process.env.ENV = process.env.NODE_ENV = 'development'; +const ENV = Config.BUILD_TYPE = process.env.ENV = process.env.NODE_ENV = 'development'; const HOST = process.env.HOST || 'localhost'; const PORT = process.env.PORT || 3000; const HMR = helpers.hasProcessFlag('hot'); -const METADATA = webpackMerge(commonConfig({env: Config.BUILD_TYPE}).metadata, { +const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, { host: HOST, port: PORT, ENV: ENV, @@ -35,7 +35,7 @@ const DllBundlesPlugin = require('webpack-dll-bundles-plugin').DllBundlesPlugin; * See: http://webpack.github.io/docs/configuration.html#cli */ module.exports = function (options) { - return webpackMerge(commonConfig({env: Config.BUILD_TYPE}), { + return webpackMerge(commonConfig({env: ENV}), { /** diff --git a/electron/webpack/config/webpack.dev.ts b/electron/webpack/config/webpack.dev.ts index e69de29bb..bcd059211 100644 --- a/electron/webpack/config/webpack.dev.ts +++ b/electron/webpack/config/webpack.dev.ts @@ -0,0 +1,254 @@ +import Config from '../../../tools/config'; +const helpers = require('./helpers'); +const webpackMerge = require('webpack-merge'); // used to merge webpack configs +const webpackMergeDll = webpackMerge.strategy({plugins: 'replace'}); +const commonConfig = require('./webpack.common.js'); // the settings that are common to prod and dev + +/** + * Webpack Plugins + */ +const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin'); +const DefinePlugin = require('webpack/lib/DefinePlugin'); +const NamedModulesPlugin = require('webpack/lib/NamedModulesPlugin'); +const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); + +/** + * Webpack Constants + */ +const ENV = Config.BUILD_TYPE = process.env.ENV = process.env.NODE_ENV = 'development'; +const HOST = process.env.HOST || 'localhost'; +const PORT = process.env.PORT || 3000; +const HMR = helpers.hasProcessFlag('hot'); +const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, { + host: HOST, + port: PORT, + ENV: ENV, + HMR: HMR +}); + + +const DllBundlesPlugin = require('webpack-dll-bundles-plugin').DllBundlesPlugin; + +/** + * Webpack configuration + * + * See: http://webpack.github.io/docs/configuration.html#cli + */ +module.exports = function (options) { + return webpackMerge(commonConfig({env: ENV}), { + + /** + * Developer tool to enhance debugging + * + * See: http://webpack.github.io/docs/configuration.html#devtool + * See: https://github.com/webpack/docs/wiki/build-performance#sourcemaps + */ + devtool: 'cheap-module-source-map', + + /** + * Options affecting the output of the compilation. + * + * See: http://webpack.github.io/docs/configuration.html#output + */ + output: { + + /** + * The output directory as absolute path (required). + * + * See: http://webpack.github.io/docs/configuration.html#output-path + */ + path: helpers.root(Config.APP_DEST), + + /** + * Specifies the name of each output file on disk. + * IMPORTANT: You must not specify an absolute path here! + * + * See: http://webpack.github.io/docs/configuration.html#output-filename + */ + filename: '[name].bundle.js', + + /** + * The filename of the SourceMaps for the JavaScript files. + * They are inside the output.path directory. + * + * See: http://webpack.github.io/docs/configuration.html#output-sourcemapfilename + */ + sourceMapFilename: '[file].map', + + /** The filename of non-entry chunks as relative path + * inside the output.path directory. + * + * See: http://webpack.github.io/docs/configuration.html#output-chunkfilename + */ + chunkFilename: '[id].chunk.js', + + library: 'ac_[name]', + libraryTarget: 'var', + }, + + module: { + + rules: [ + { + test: /\.ts$/, + use: [ + { + loader: 'tslint-loader', + options: { + configFile: 'tslint.json' + } + } + ], + exclude: [/\.(spec|e2e)\.ts$/] + }, + + /* + * css loader support for *.css files (styles directory only) + * Loads external css styles into the DOM, supports HMR + * + */ + { + test: /\.css$/, + use: ['style-loader', 'css-loader'], + include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.css')] + }, + + /* + * sass loader support for *.scss files (styles directory only) + * Loads external sass styles into the DOM, supports HMR + * + */ + { + test: /\.scss$/, + use: ['style-loader', 'css-loader', 'sass-loader'], + include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.scss')] + }, + + ] + + }, + + plugins: [ + + /** + * Plugin: DefinePlugin + * Description: Define free variables. + * Useful for having development builds with debug logging or adding global constants. + * + * Environment helpers + * + * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin + */ + // NOTE: when adding more properties, make sure you include them in custom-typings.d.ts + new DefinePlugin({ + 'ENV': JSON.stringify(METADATA.ENV), + 'HMR': METADATA.HMR, + 'process.env': { + 'ENV': JSON.stringify(METADATA.ENV), + 'NODE_ENV': JSON.stringify(METADATA.ENV), + 'HMR': METADATA.HMR, + } + }), + + new DllBundlesPlugin({ + bundles: { + polyfills: [ + 'core-js', + { + name: 'zone.js', + path: 'zone.js/dist/zone.js' + }, + { + name: 'zone.js', + path: 'zone.js/dist/long-stack-trace-zone.js' + }, + ], + vendor: [ + '@angular/platform-browser', + '@angular/platform-browser-dynamic', + '@angular/core', + '@angular/common', + '@angular/forms', + '@angular/http', + '@angular/router', + '@angularclass/hmr', + 'rxjs', + ] + }, + dllDir: helpers.root('dll'), + webpackConfig: webpackMergeDll(commonConfig({env: ENV}), { + devtool: 'cheap-module-source-map', + plugins: [] + }) + }), + + /** + * Plugin: AddAssetHtmlPlugin + * Description: Adds the given JS or CSS file to the files + * Webpack knows about, and put it into the list of assets + * html-webpack-plugin injects into the generated html. + * + * See: https://github.com/SimenB/add-asset-html-webpack-plugin + */ + new AddAssetHtmlPlugin([ + { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('polyfills')}`) }, + { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('vendor')}`) } + ]), + + /** + * Plugin: NamedModulesPlugin (experimental) + * Description: Uses file names as module name. + * + * See: https://github.com/webpack/webpack/commit/a04ffb928365b19feb75087c63f13cadfc08e1eb + */ + // new NamedModulesPlugin(), + + /** + * Plugin LoaderOptionsPlugin (experimental) + * + * See: https://gist.github.com/sokra/27b24881210b56bbaff7 + */ + new LoaderOptionsPlugin({ + debug: true, + options: { + + } + }), + + ], + + /** + * Webpack Development Server configuration + * Description: The webpack-dev-server is a little node.js Express server. + * The server emits information about the compilation state to the client, + * which reacts to those events. + * + * See: https://webpack.github.io/docs/webpack-dev-server.html + */ + devServer: { + port: METADATA.port, + host: METADATA.host, + historyApiFallback: true, + watchOptions: { + aggregateTimeout: 300, + poll: 1000 + } + }, + + /* + * Include polyfills or mocks for various node stuff + * Description: Node configuration + * + * See: https://webpack.github.io/docs/configuration.html#node + */ + node: { + global: true, + crypto: 'empty', + process: true, + module: false, + clearImmediate: false, + setImmediate: false + } + + }); +} \ No newline at end of file From 456ae1a3e737318755f5d173d8e5438c048c567f Mon Sep 17 00:00:00 2001 From: ianm Date: Thu, 30 Mar 2017 22:36:57 -0400 Subject: [PATCH 13/17] derp cleanup --- electron/helpers.js | 40 +++ electron/karma.conf.js | 73 ++++-- electron/{tools/electron => }/package.js | 4 +- electron/package.json | 93 +++---- electron/src/app.desktop.scss | 0 electron/src/app.ts | 6 - electron/src/assets/data.json | 6 - electron/src/assets/favicon/favicon-DEV.ico | Bin 1150 -> 0 bytes electron/src/assets/favicon/favicon-PROD.ico | Bin 1118 -> 0 bytes electron/src/assets/i18n/bg.json | 11 - electron/src/assets/i18n/en.json | 11 - electron/src/assets/i18n/es.json | 11 - electron/src/assets/i18n/fr.json | 11 - electron/src/assets/i18n/ru.json | 11 - electron/src/assets/logo.icns | Bin 121052 -> 0 bytes electron/src/assets/logo.ico | Bin 370070 -> 0 bytes electron/src/assets/svg/more.svg | 7 - electron/src/assets/svg/smile.svg | 170 ------------ electron/src/components.module.ts | 57 ----- electron/src/electron.module.ts | 97 ------- electron/src/package.json | 5 - electron/src/polyfills.ts | 24 -- electron/src/vendor.ts | 10 - electron/tsconfig.json | 1 - electron/tslint.json | 80 ++++++ electron/typedoc.json | 15 ++ electron/webpack.config.js | 165 ++++++++++-- electron/webpack.test.js | 248 ++++++++++++++++++ electron/webpack/config/helpers.ts | 20 -- electron/webpack/config/webpack.common.ts | 256 ------------------- electron/webpack/config/webpack.dev.ts | 254 ------------------ electron/webpack/config/webpack.prod.ts | 0 electron/webpack/config/webpack.test.ts | 0 tools/tasks/seed/build.elec.config.ts | 2 +- 34 files changed, 631 insertions(+), 1057 deletions(-) create mode 100644 electron/helpers.js rename electron/{tools/electron => }/package.js (94%) delete mode 100644 electron/src/app.desktop.scss delete mode 100644 electron/src/app.ts delete mode 100644 electron/src/assets/data.json delete mode 100644 electron/src/assets/favicon/favicon-DEV.ico delete mode 100644 electron/src/assets/favicon/favicon-PROD.ico delete mode 100644 electron/src/assets/i18n/bg.json delete mode 100644 electron/src/assets/i18n/en.json delete mode 100644 electron/src/assets/i18n/es.json delete mode 100644 electron/src/assets/i18n/fr.json delete mode 100644 electron/src/assets/i18n/ru.json delete mode 100644 electron/src/assets/logo.icns delete mode 100644 electron/src/assets/logo.ico delete mode 100644 electron/src/assets/svg/more.svg delete mode 100644 electron/src/assets/svg/smile.svg delete mode 100644 electron/src/components.module.ts delete mode 100644 electron/src/electron.module.ts delete mode 100644 electron/src/package.json delete mode 100644 electron/src/polyfills.ts delete mode 100644 electron/src/vendor.ts create mode 100644 electron/tslint.json create mode 100644 electron/typedoc.json create mode 100644 electron/webpack.test.js delete mode 100644 electron/webpack/config/helpers.ts delete mode 100644 electron/webpack/config/webpack.common.ts delete mode 100644 electron/webpack/config/webpack.dev.ts delete mode 100644 electron/webpack/config/webpack.prod.ts delete mode 100644 electron/webpack/config/webpack.test.ts diff --git a/electron/helpers.js b/electron/helpers.js new file mode 100644 index 000000000..b62f83f56 --- /dev/null +++ b/electron/helpers.js @@ -0,0 +1,40 @@ +var path = require('path'); +var zlib = require('zlib'); + + +// Helper functions + +function hasProcessFlag(flag) { + return process.argv.join('').indexOf(flag) > -1; +} + +function gzipMaxLevel(buffer, callback) { + return zlib['gzip'](buffer, {level: 9}, callback); +} + +function root(args) { + args = Array.prototype.slice.call(arguments, 0); + return path.join.apply(path, [__dirname].concat(args)); +} + +function rootNode(args) { + args = Array.prototype.slice.call(arguments, 0); + return root.apply(path, ['node_modules'].concat(args)); +} + +function prependExt(extensions, args) { + args = args || []; + if (!Array.isArray(args)) { args = [args] } + return extensions.reduce(function(memo, val) { + return memo.concat(val, args.map(function(prefix) { + return prefix + val; + })); + }, ['']); +} + +exports.hasProcessFlag = hasProcessFlag; +exports.gzipMaxLevel = gzipMaxLevel; +exports.root = root; +exports.rootNode = rootNode; +exports.prependExt = prependExt; +exports.prepend = prependExt; \ No newline at end of file diff --git a/electron/karma.conf.js b/electron/karma.conf.js index 7b353b6a8..1774837de 100644 --- a/electron/karma.conf.js +++ b/electron/karma.conf.js @@ -1,27 +1,41 @@ -module.exports = function(config) { - var testWebpackConfig = require('./webpack.test.js'); +module.exports = function (config) { + var testWebpackConfig = require('./webpack.test.js')({ env: 'test' }); - config.set({ + var configuration = { // base path that will be used to resolve all patterns (e.g. files, exclude) basePath: '', /* - * Frameworks to use. We will use jasmine, default for angular2 testing + * Frameworks to use * * available frameworks: https://npmjs.org/browse/keyword/karma-adapter */ frameworks: ['jasmine'], // list of files to exclude - exclude: [ ], + exclude: [], + + client: { + captureConsole: false + }, /* * list of files / patterns to load in the browser * * we are building the test environment in ./spec-bundle.js */ - files: [ { pattern: './config/spec-bundle.js', watched: false } ], + files: [ + { pattern: './config/spec-bundle.js', watched: false }, + { pattern: './src/assets/**/*', watched: false, included: false, served: true, nocache: false } + ], + + /* + * By default all assets are served at http://localhost:[PORT]/base/ + */ + proxies: { + "/assets/": "/base/src/assets/" + }, /* * preprocess matching files before serving them to the browser @@ -33,16 +47,26 @@ module.exports = function(config) { webpack: testWebpackConfig, coverageReporter: { - dir : 'coverage/', - reporters: [ - { type: 'text-summary' }, - { type: 'json' }, - { type: 'html' } - ] + type: 'in-memory' + }, + + remapCoverageReporter: { + 'text-summary': null, + json: './coverage/coverage.json', + html: './coverage/html' }, // Webpack please don't spam the console when running in karma! - webpackServer: { noInfo: true }, + webpackMiddleware: { + // webpack-dev-middleware configuration + // i.e. + noInfo: true, + // and use stats to turn off verbose output + stats: { + // options i.e. + chunks: false + } + }, /* * test results reporter to use @@ -50,7 +74,7 @@ module.exports = function(config) { * possible values: 'dots', 'progress' * available reporters: https://npmjs.org/browse/keyword/karma-reporter */ - reporters: [ 'mocha', 'coverage' ], + reporters: ['mocha', 'coverage', 'remap-coverage'], // web server port port: 9876, @@ -62,7 +86,7 @@ module.exports = function(config) { * level of logging * possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG */ - logLevel: config.LOG_INFO, + logLevel: config.LOG_WARN, // enable / disable watching file and executing tests whenever any file changes autoWatch: false, @@ -72,15 +96,28 @@ module.exports = function(config) { * available browser launchers: https://npmjs.org/browse/keyword/karma-launcher */ browsers: [ - // 'Chrome', - 'PhantomJS' + 'Chrome' ], + customLaunchers: { + ChromeTravisCi: { + base: 'Chrome', + flags: ['--no-sandbox'] + } + }, + /* * Continuous Integration mode * if true, Karma captures browsers, runs the tests and exits */ singleRun: true - }); + }; + + if (process.env.TRAVIS) { + configuration.browsers = [ + 'ChromeTravisCi' + ]; + } + config.set(configuration); }; \ No newline at end of file diff --git a/electron/tools/electron/package.js b/electron/package.js similarity index 94% rename from electron/tools/electron/package.js rename to electron/package.js index a92d117ea..8445f03b7 100644 --- a/electron/tools/electron/package.js +++ b/electron/package.js @@ -9,7 +9,7 @@ const appName = argv.name || pkg.productName; const shouldUseAsar = argv.asar || false; const shouldBuildAll = argv.all || false; const arch = argv.arch || 'all'; -const platform = argv.platform || 'win32'; +const platform = argv.platform || 'darwin'; const DEFAULT_OPTS = { dir: './src/app', @@ -30,7 +30,7 @@ pack(platform, arch, function done(err, appPath) { }); function pack(plat, arch, cb) { - // darwin ia32 electron doesn't exist. + // there is no darwin ia32 electron if (plat === 'darwin' && arch === 'ia32') return; const iconObj = { diff --git a/electron/package.json b/electron/package.json index 64a9f26e6..b3e4e9b59 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,8 +1,8 @@ { - "name": "angular-seed-advanced", + "name": "angular2-electron", "version": "0.0.0", "description": "Angular 2 with Electron and Webpack", - "main": "main.desktop.js", + "main": "", "scripts": { "watch": "npm run watch:dev", "watch:dev": "webpack --watch --progress --profile", @@ -14,74 +14,56 @@ "webpack-test": "webpack --config webpack.test.js --progress --profile", "test": "karma start" }, + "repository": { + "type": "git", + "url": "https://github.com/joaogarin/angular2-electron.git" + }, + "author": "joaogarin ", + "license": "MIT", + "bugs": { + "url": "https://github.com/joaogarin/angular2-electron/issues" + }, + "homepage": "", "dependencies": { - "@angular/common": "~2.4.0", - "@angular/compiler": "~2.4.0", - "@angular/core": "~2.4.0", - "@angular/forms": "~2.4.0", - "@angular/http": "~2.4.0", - "@angular/platform-browser": "~2.4.0", - "@angular/platform-browser-dynamic": "~2.4.0", - "@angular/router": "~3.4.1", + "@angular/common": "^4.0.0", + "@angular/compiler": "^4.0.0", + "@angular/core": "^4.0.0", + "@angular/forms": "^4.0.0", + "@angular/http": "^4.0.0", + "@angular/platform-browser": "^4.0.0", + "@angular/platform-browser-dynamic": "^4.0.0", + "@angular/platform-server": "^4.0.0", + "@angular/router": "^4.0.0", "@ngrx/core": "^1.2.0", "@ngrx/effects": "^2.0.0", "@ngrx/store": "^2.2.1", "@ngx-translate/core": "^6.0.0", "@ngx-translate/http-loader": "0.0.3", "angulartics2": "^1.6.4", + "copy-webpack-plugin": "^4.0.1", "core-js": "^2.4.1", - "css-loader": "^0.26.4", - "electron": "^1.6.2", - "electron-settings": "^2.2.2", "es-module-loader": "^1.0.0", - "es6-promise": "^4.1.0", "intl": "^1.2.5", "lodash": "^4.17.4", "minimatch": "^3.0.3", - "reflect-metadata": "^0.1.8", - "rxjs": "~5.0.3", - "systemjs": "0.19.41", + "electron": "^1.4.3", + "rxjs": "^5.2.0", "webpack-target-electron-renderer": "^0.4.0", - "zone.js": "^0.7.2" + "zone.js": "^0.8.5" }, "devDependencies": { - "@types/electron": "^1.4.35", "@types/hammerjs": "^2.0.33", + "@types/jasmine": "^2.2.34", "@types/moment-timezone": "^0.2.32", - "@types/mongodb": "^2.1.41", + "@types/node": "^7.0.1", "@types/source-map": "^0.5.0", "@types/uglify-js": "^2.0.27", "@types/webpack": "^2.0.0", - "@angular/compiler-cli": "~2.4.0", - "@angular/platform-server": "~2.4.0", - "@ngrx/store-devtools": "^3.2.2", - "@types/async": "^2.0.32", - "@types/browser-sync": "^0.0.34", - "@types/express": "^4.0.33", - "@types/gulp": "^3.8.32", - "@types/gulp-filter": "^3.0.29", - "@types/gulp-load-plugins": "^0.0.28", - "@types/gulp-newer": "0.0.29", - "@types/gulp-protractor": "^1.0.29", - "@types/gulp-rename": "0.0.31", - "@types/gulp-sass": "^0.0.29", - "@types/gulp-util": "^3.0.29", - "@types/jasmine": "^2.5.35", - "@types/lodash": "^4.14.37", - "@types/node": "^6.0.45", - "@types/rimraf": "0.0.28", - "@types/run-sequence": "^0.0.28", - "@types/selenium-webdriver": "^2.53.39", - "@types/systemjs": "^0.19.31", - "@types/yargs": "^6.5.0", - "@types/zone.js": "^0.0.27", "angular2-template-loader": "^0.6.0", - "awesome-typescript-loader": "^3.0.8", + "awesome-typescript-loader": "^3.0.0-beta.18", "codelyzer": "^2.0.0-beta.2", - "css-loader": "^0.26.0", + "css-loader": "^0.28.0", "electron-packager": "^8.1.0", - "electron-rebuild": "^1.5.7", - "electron-reload": "^1.1.0", "es6-promise-loader": "^1.0.1", "extract-text-webpack-plugin": "^2.0.0", "file-loader": "^0.10.0", @@ -94,6 +76,7 @@ "karma-coverage": "^1.0.0", "karma-jasmine": "^1.0.2", "karma-mocha-reporter": "^2.0.0", + "karma-remap-coverage": "^0.1.4", "karma-phantomjs-launcher": "^1.0.0", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "2.0.2", @@ -106,16 +89,20 @@ "rimraf": "^2.5.2", "sass-loader": "^6.0.1", "source-map-loader": "^0.1.5", - "style-loader": "^0.13.1", + "style-loader": "^0.16.1", "svg-url-loader": "^2.0.0", "ts-helpers": "^1.1.1", "tsconfig-lint": "^0.12.0", - "tslint": "^4.3.2", + "tslint": "^5.0.0", "tslint-loader": "^3.2.0", - "typescript": "^2.1.4", + "typescript": "~2.1.5", "url-loader": "^0.5.7", - "webpack": "^2.2.1", - "webpack-dev-middleware": "^1.10.1", - "webpack-dev-server": "^2.4.1" + "webpack": "2.3.1", + "webpack-dev-middleware": "^1.10.0", + "webpack-dev-server": "2.4.1" + }, + "engines": { + "node": ">= 4.2.1 <= 6", + "npm": ">= 3" } } diff --git a/electron/src/app.desktop.scss b/electron/src/app.desktop.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/electron/src/app.ts b/electron/src/app.ts deleted file mode 100644 index c2989bb74..000000000 --- a/electron/src/app.ts +++ /dev/null @@ -1,6 +0,0 @@ -//electron -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -// app -import { ElectronModule } from './electron.module'; - -platformBrowserDynamic().bootstrapModule(ElectronModule); diff --git a/electron/src/assets/data.json b/electron/src/assets/data.json deleted file mode 100644 index d371e9ce9..000000000 --- a/electron/src/assets/data.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - "Edsger Dijkstra", - "Donald Knuth", - "Alan Turing", - "Grace Hopper" -] diff --git a/electron/src/assets/favicon/favicon-DEV.ico b/electron/src/assets/favicon/favicon-DEV.ico deleted file mode 100644 index 2b6c8f0a9ad7bec10cb914d84cb941d36fa5f0b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmchVzb^z)5XVO%3gl+o1rf!GiqhXfsg;PhbGi4FYAUV2LZR^^;tHA#Zr^rSYE(o- zq7YGNWX*e*NhTY6Ps47$`<seJzg(Lhz1gZRGPmO_z504;=~(JTFY>yc zw5XmLd z&W7h3eAJx8F+Mfe2)xA$VYCn8yUofx*I#^3YH?L_5^H{sS3YS^j$IpE;{U(TdJA=f z9qBK+@MX?3&aavil_Dqin)Cb5`|{4ZJnW&)v diff --git a/electron/src/assets/i18n/bg.json b/electron/src/assets/i18n/bg.json deleted file mode 100644 index 60d246079..000000000 --- a/electron/src/assets/i18n/bg.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "HOME": "у дома", - "ABOUT": "около", - "HELLO": "Здравей", - "LOVE_TECH": "Обичам технологиите!", - "ABOUT_ADD": "Искаш повече? Добавете ги себе си!", - "ABOUT_REWARD": "За награда, тук е списък на страхотни компютърни специалисти:", - "INPUT_HINT": "Въвеждане на нов компютърен специалист...", - "ADD_BTN_TEXT": "Добави", - "SUCCESS_MSG": "Вашият разполагане на ъгловото Seed Advanced работи перфектно." -} diff --git a/electron/src/assets/i18n/en.json b/electron/src/assets/i18n/en.json deleted file mode 100644 index 97814db05..000000000 --- a/electron/src/assets/i18n/en.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "HOME": "Home", - "ABOUT": "About", - "HELLO": "Hello", - "LOVE_TECH": "I love technology!", - "ABOUT_ADD": "You want more? Add them yourself!", - "ABOUT_REWARD": "For reward, here is a list of awesome computer scientists:", - "INPUT_HINT": "Enter a new computer scientist...", - "ADD_BTN_TEXT": "Add", - "SUCCESS_MSG": "Your deployment of Angular Seed Advanced worked perfectly." -} diff --git a/electron/src/assets/i18n/es.json b/electron/src/assets/i18n/es.json deleted file mode 100644 index 37e890520..000000000 --- a/electron/src/assets/i18n/es.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "HOME": "Casa", - "ABOUT": "Acerca de", - "HELLO": "Hola", - "LOVE_TECH": "Me encanta la tecnología!", - "ABOUT_ADD": "¿Quieres más? Añadir a ti mismo!", - "ABOUT_REWARD": "Para recompensa, aquí hay una lista de científicos informáticos impresionantes:", - "INPUT_HINT": "Introduzca un nuevo científico de la computación...", - "ADD_BTN_TEXT": "Añadir", - "SUCCESS_MSG": "Su despliegue de Angular avanzada Semilla funcionó a la perfección." -} diff --git a/electron/src/assets/i18n/fr.json b/electron/src/assets/i18n/fr.json deleted file mode 100644 index 8d72aa98e..000000000 --- a/electron/src/assets/i18n/fr.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "HOME": "Accueil", - "ABOUT": "À propos", - "HELLO": "Bonjour", - "LOVE_TECH": "J'adore la technologie !", - "ABOUT_ADD": "Vous en voulez plus? Ajoutez-les vous-même !", - "ABOUT_REWARD": "En récompense, voici une liste de géniaux informaticiens :", - "INPUT_HINT": "Ajouter un nouvel informaticien...", - "ADD_BTN_TEXT": "Ajouter", - "SUCCESS_MSG": "Votre déploiement d'Angular Seed Advanced a parfaitement fonctionné." -} diff --git a/electron/src/assets/i18n/ru.json b/electron/src/assets/i18n/ru.json deleted file mode 100644 index 433ec6b3c..000000000 --- a/electron/src/assets/i18n/ru.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "HOME": "Главная", - "ABOUT": "Справка", - "HELLO": "Здравствуйте", - "LOVE_TECH": "Я люблю технологию!", - "ABOUT_ADD": "Хочешь больше? Добавь их самостоятельно!", - "ABOUT_REWARD": "В награду, вот список классных компьютерных ученых:", - "INPUT_HINT": "Введите нового ученого...", - "ADD_BTN_TEXT": "Добавить", - "SUCCESS_MSG": "Ваш Angular Seed Advanced развернут отлично." -} diff --git a/electron/src/assets/logo.icns b/electron/src/assets/logo.icns deleted file mode 100644 index 983a10d3e32d6a50f5e69c9ff07b77eca867c347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121052 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 Kx9U6k?tcMa$$aeq diff --git a/electron/src/assets/svg/more.svg b/electron/src/assets/svg/more.svg deleted file mode 100644 index 1b6b1dd01..000000000 --- a/electron/src/assets/svg/more.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/electron/src/assets/svg/smile.svg b/electron/src/assets/svg/smile.svg deleted file mode 100644 index 368c12e4c..000000000 --- a/electron/src/assets/svg/smile.svg +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - emoticon - emote - smiley - happy - :) - :-) - - - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/electron/src/components.module.ts b/electron/src/components.module.ts deleted file mode 100644 index c1f00823d..000000000 --- a/electron/src/components.module.ts +++ /dev/null @@ -1,57 +0,0 @@ -//electron -// angular -import { NgModule } from '@angular/core'; -import { Http, HttpModule } from '@angular/http'; -import { FormsModule } from '@angular/forms'; - -// libs -import { TranslateLoader } from '@ngx-translate/core'; -import { TranslateHttpLoader } from '@ngx-translate/http-loader'; - -// app -import { AppComponent } from './app/components/app.component'; -import { AboutComponent } from './app/components/about/about.component'; -import { HomeComponent } from './app/components/home/home.component'; -import { routes } from './app/components/app.routes'; - -// feature modules -import { CoreModule } from './app/shared/core/core.module'; -import { AnalyticsModule } from './app/shared/analytics/analytics.module'; -import { MultilingualModule, translateLoaderFactory } from './app/shared/i18n/multilingual.module'; -import { SampleModule } from './app/shared/sample/sample.module'; - -// intermediate component module -// helps encapsulate custom native modules in with the components -// note: couple ways this could be done, just one option presented here... -@NgModule({ - imports: [ - FormsModule, - HttpModule, - AnalyticsModule, - CoreModule, - MultilingualModule.forRoot([{ - provide: TranslateLoader, - deps: [Http], - useFactory: (translateLoaderFactory) - }]), - SampleModule - ], - declarations: [ - AppComponent, - HomeComponent, - AboutComponent - ], - exports: [ - MultilingualModule, - AppComponent, - AnalyticsModule, - CoreModule, - SampleModule - ] -}) -export class ComponentsModule { } - -// For AoT compilation to work: -export function cons() { - return console; -} diff --git a/electron/src/electron.module.ts b/electron/src/electron.module.ts deleted file mode 100644 index 144e54eab..000000000 --- a/electron/src/electron.module.ts +++ /dev/null @@ -1,97 +0,0 @@ -//electron -// angular -import { NgModule } from '@angular/core'; -import { APP_BASE_HREF } from '@angular/common'; -import { BrowserModule } from '@angular/platform-browser'; -import { RouterModule } from '@angular/router'; -import { Http } from '@angular/http'; - -// libs -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; -import { StoreDevtoolsModule } from '@ngrx/store-devtools'; -import { TranslateLoader } from '@ngx-translate/core'; - -// app -import { AppComponent } from './app/components/app.component'; -import { routes } from './app/components/app.routes'; - -// feature modules -import { CoreModule } from './app/shared/core/core.module'; -import { AppReducer } from './app/shared/ngrx/index'; -import { AnalyticsModule } from './app/shared/analytics/analytics.module'; -import { MultilingualModule, translateLoaderFactory } from './app/shared/i18n/multilingual.module'; -import { MultilingualEffects } from './app/shared/i18n/index'; -import { SampleModule } from './app/shared/sample/sample.module'; -import { NameListEffects } from './app/shared/sample/index'; - -// config -import { Config, WindowService, ConsoleService } from './app/shared/core/index'; -Config.PLATFORM_TARGET = Config.PLATFORMS.WEB; -if (String('<%= BUILD_TYPE %>') === 'dev') { - // only output console logging in dev mode - Config.DEBUG.LEVEL_4 = true; -} - -// sample config (extra) -import { AppConfig } from './app/shared/sample/services/app-config'; -import { MultilingualService } from './app/shared/i18n/services/multilingual.service'; -// custom i18n language support -MultilingualService.SUPPORTED_LANGUAGES = AppConfig.SUPPORTED_LANGUAGES; - -let routerModule = RouterModule.forRoot(routes); - -if (String('<%= TARGET_DESKTOP %>') === 'true') { - Config.PLATFORM_TARGET = Config.PLATFORMS.DESKTOP; - // desktop (electron) must use hash - routerModule = RouterModule.forRoot(routes, { useHash: true }); -} - -declare var window, console; - -// For AoT compilation to work: -export function win() { - return window; -} -export function cons() { - return console; -} - -let DEV_IMPORTS: any[] = []; - -if (String('<%= BUILD_TYPE %>') === 'dev') { - DEV_IMPORTS = [ - ...DEV_IMPORTS, - StoreDevtoolsModule.instrumentOnlyWithExtension() - ]; -} - -@NgModule({ - imports: [ - BrowserModule, - CoreModule.forRoot([ - { provide: WindowService, useFactory: (win) }, - { provide: ConsoleService, useFactory: (cons) } - ]), - routerModule, - AnalyticsModule, - MultilingualModule.forRoot([{ - provide: TranslateLoader, - deps: [Http], - useFactory: (translateLoaderFactory) - }]), - StoreModule.provideStore(AppReducer), - DEV_IMPORTS, - EffectsModule.run(MultilingualEffects), - EffectsModule.run(NameListEffects) - ], - providers: [ - { - provide: APP_BASE_HREF, - useValue: '<%= APP_BASE %>' - } - ], - bootstrap: [AppComponent] -}) - -export class ElectronModule { } diff --git a/electron/src/package.json b/electron/src/package.json deleted file mode 100644 index 102631975..000000000 --- a/electron/src/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "angular-seed-advanced", - "version": "1.0.0", - "main": "main.desktop.js" -} diff --git a/electron/src/polyfills.ts b/electron/src/polyfills.ts deleted file mode 100644 index 703f389d0..000000000 --- a/electron/src/polyfills.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Polyfills -// (these modules are what are in 'angular2/bundles/angular2-polyfills' so don't use that here) - -// import 'ie-shim'; // Internet Explorer -// import 'es6-shim'; -// import 'es6-promise'; -// import 'es7-reflect-metadata'; - -// Prefer CoreJS over the polyfills above -import 'core-js/es6'; -import 'core-js/es7/reflect'; -require('zone.js/dist/zone.js'); -//Error['stackTraceLimit'] = Infinity; - -require('zone.js/dist/long-stack-trace-zone'); - -// RxJS -// to include every operator uncomment -//require('rxjs/Rx'); - -require('rxjs/add/operator/map'); -require('rxjs/add/operator/mergeMap'); -require('rxjs/add/observable/throw'); - diff --git a/electron/src/vendor.ts b/electron/src/vendor.ts deleted file mode 100644 index a17776b2f..000000000 --- a/electron/src/vendor.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Angular 2 -import '@angular/platform-browser'; -import '@angular/core'; -import '@angular/router'; -import '@angular/http'; - -// RxJS -import 'rxjs/add/operator/map'; -import 'rxjs/add/operator/filter'; -import 'rxjs/add/operator/mergeMap'; diff --git a/electron/tsconfig.json b/electron/tsconfig.json index 4a038d0a1..f5bd60a6f 100644 --- a/electron/tsconfig.json +++ b/electron/tsconfig.json @@ -19,7 +19,6 @@ ] }, "exclude": [ - "release", "node_modules", "dist" ], diff --git a/electron/tslint.json b/electron/tslint.json new file mode 100644 index 000000000..633ff8b1e --- /dev/null +++ b/electron/tslint.json @@ -0,0 +1,80 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "directive-selector-name": [true, "camelCase"], + "component-selector-name": [true, "kebab-case"], + "directive-selector-type": [true, "attribute"], + "component-selector-type": [true, "element"], + "directive-selector-prefix": [true, "ae"], + "component-selector-prefix": [true, "ae"], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-attribute-parameter-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "no-forward-ref" :true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "pipe-naming": [true, "camelCase", "sg"], + "component-class-suffix": true, + "directive-class-suffix": true, + "import-destructuring-spacing": true, + "class-name": true, + "curly": false, + "eofline": true, + "indent": [ + true, + "spaces" + ], + "max-line-length": [ + true, + 300 + ], + "member-ordering": [ + true, + "public-before-private", + "static-before-instance", + "variables-before-functions" + ], + "no-arg": true, + "no-construct": true, + "no-duplicate-key": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-eval": true, + "trailing-comma": true, + "no-trailing-whitespace": false, + "no-unused-expression": true, + "no-unused-variable": false, + "no-unreachable": true, + "no-use-before-declare": true, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "quotemark": [ + true, + "single" + ], + "semicolon": true, + "triple-equals": [ + false, + "allow-null-check" + ], + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + } +} diff --git a/electron/typedoc.json b/electron/typedoc.json new file mode 100644 index 000000000..1a9f28275 --- /dev/null +++ b/electron/typedoc.json @@ -0,0 +1,15 @@ +{ + "mode": "modules", + "out": "doc", + "theme": "default", + "ignoreCompilerErrors": "true", + "experimentalDecorators": "true", + "emitDecoratorMetadata": "true", + "target": "ES5", + "moduleResolution": "node", + "preserveConstEnums": "true", + "stripInternal": "true", + "suppressExcessPropertyErrors": "true", + "suppressImplicitAnyIndexErrors": "true", + "module": "commonjs" +} \ No newline at end of file diff --git a/electron/webpack.config.js b/electron/webpack.config.js index 1d1192747..8f4f4bc61 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -1,15 +1,150 @@ -//webpack config per environment set from seed start script -switch (process.env.NODE_ENV) { - case 'prod': - case 'production': - module.exports = require('./config/webpack.prod')({env: 'production'}); - break; - case 'test': - case 'testing': - module.exports = require('./config/webpack.test')({env: 'test'}); - break; - case 'dev': - case 'development': - default: - module.exports = require('./config/webpack.dev')({env: 'development'}); -} +// @joaogarin + +/* + * Helper: root(), and rootDir() are defined at the bottom + */ +const webpack = require('webpack'); +const helpers = require('./helpers'); +const path = require('path'); + +var CopyWebpackPlugin = require('copy-webpack-plugin'); +const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); + +/* + * Config + */ +var config = { + // for faster builds use 'eval' + devtool: 'source-map', + // cache: false, + + // our angular app + entry: { + 'polyfills': './src/polyfills.ts', + 'vendor': './src/vendor.ts', + 'app': './src/app/app', + }, + + // Config for our build files + output: { + path: helpers.root('src/app/dist'), + filename: '[name].js', + sourceMapFilename: '[name].map', + chunkFilename: '[id].chunk.js' + }, + /* + * Options affecting the resolving of modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve + */ + resolve: { + /* + * An array of extensions that should be used to resolve modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve-extensions + */ + extensions: ['.ts', '.js', '.json', '.css', '.html'], + + // An array of directory names to be resolved to the current directory + modules: [helpers.root('src'), 'node_modules'], + + }, + /* + * Options affecting the resolving of modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve + */ + module: { + rules: [ + // Support for .ts files. + { + test: /\.ts$/, + loaders: ['awesome-typescript-loader', 'angular2-template-loader'], + exclude: [/\.(spec|e2e)\.ts$/] + }, + + // Support for *.json files. + { + test: /\.json$/, + loader: 'json-loader' + }, + { + test: /\.scss$/, + exclude: /node_modules/, + loaders: ['raw-loader', 'sass-loader'] // sass-loader not scss-loader + }, + + // support for .html antd .css as raw text + { + test: /\.html$/, + loader: 'raw-loader', + exclude: [helpers.root('app/index.html')] + }, + + // support for fonts + { + test: /\.(ttf|eot|svg|woff(2)?)(\?[a-z0-9=&.]+)?$/, + loader: 'file-loader?name=dist/[name]-[hash].[ext]' + }, + + // support for svg icons + { + test: /\.svg/, + loader: 'svg-url-loader' + } + ] + }, + plugins: [ + + // Plugin: CommonsChunkPlugin + // Description: Shares common code between the pages. + // It identifies common modules and put them into a commons chunk. + // + // See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin + // See: https://github.com/webpack/docs/wiki/optimization#multi-page-app + new webpack.optimize.CommonsChunkPlugin({ name: ['vendor', 'polyfills'], minChunks: Infinity }), + // Plugin: CopyWebpackPlugin + // Description: Copy files and directories in webpack. + // + // Copies project static assets. + // + // See: https://www.npmjs.com/package/copy-webpack-plugin + new CopyWebpackPlugin([{ from: 'src/assets', to: 'assets' }]), + /** + * Plugin LoaderOptionsPlugin (experimental) + * + * See: https://gist.github.com/sokra/27b24881210b56bbaff7 + */ + new LoaderOptionsPlugin({ + debug: true, + options: { + /** + * Static analysis linter for TypeScript advanced options configuration + * Description: An extensible linter for the TypeScript language. + * + * See: https://github.com/wbuchwalter/tslint-loader + */ + tslint: { + emitErrors: false, + failOnHint: false, + resourcePath: 'src' + }, + } + }), + ], + // we need this due to problems with es6-shim + node: { + global: true, + progress: false, + crypto: 'empty', + module: false, + clearImmediate: false, + setImmediate: false + } +}; + +/** + * Target Electron + */ +config.target = 'electron-renderer'; +module.exports = config; diff --git a/electron/webpack.test.js b/electron/webpack.test.js new file mode 100644 index 000000000..2b4381819 --- /dev/null +++ b/electron/webpack.test.js @@ -0,0 +1,248 @@ +const helpers = require('./helpers'); + +/** + * Webpack Plugins + */ +const ProvidePlugin = require('webpack/lib/ProvidePlugin'); +const DefinePlugin = require('webpack/lib/DefinePlugin'); +const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); +const ContextReplacementPlugin = require('webpack/lib/ContextReplacementPlugin'); + +/** + * Webpack Constants + */ +const ENV = process.env.ENV = process.env.NODE_ENV = 'test'; + +/** + * Webpack configuration + * + * See: http://webpack.github.io/docs/configuration.html#cli + */ +module.exports = function (options) { + return { + + /** + * Source map for Karma from the help of karma-sourcemap-loader & karma-webpack + * + * Do not change, leave as is or it wont work. + * See: https://github.com/webpack/karma-webpack#source-maps + */ + devtool: 'inline-source-map', + + /** + * Options affecting the resolving of modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve + */ + resolve: { + + /** + * An array of extensions that should be used to resolve modules. + * + * See: http://webpack.github.io/docs/configuration.html#resolve-extensions + */ + extensions: ['.ts', '.js'], + + /** + * Make sure root is src + */ + modules: [helpers.root('src'), 'node_modules'] + + }, + + /** + * Options affecting the normal modules. + * + * See: http://webpack.github.io/docs/configuration.html#module + * + * 'use:' revered back to 'loader:' as a temp. workaround for #1188 + * See: https://github.com/AngularClass/angular2-webpack-starter/issues/1188#issuecomment-262872034 + */ + module: { + + rules: [ + + /** + * Source map loader support for *.js files + * Extracts SourceMaps for source files that as added as sourceMappingURL comment. + * + * See: https://github.com/webpack/source-map-loader + */ + { + enforce: 'pre', + test: /\.js$/, + loader: 'source-map-loader', + exclude: [ + // these packages have problems with their sourcemaps + helpers.root('node_modules/rxjs'), + helpers.root('node_modules/@angular') + ] + }, + + /** + * Typescript loader support for .ts and Angular 2 async routes via .async.ts + * + * See: https://github.com/s-panferov/awesome-typescript-loader + */ + { + test: /\.ts$/, + use: [ + { + loader: 'awesome-typescript-loader', + query: { + // use inline sourcemaps for "karma-remap-coverage" reporter + sourceMap: false, + inlineSourceMap: true, + compilerOptions: { + + // Remove TypeScript helpers to be injected + // below by DefinePlugin + removeComments: true + + } + }, + }, + 'angular2-template-loader' + ], + exclude: [/\.e2e\.ts$/] + }, + + /** + * Json loader support for *.json files. + * + * See: https://github.com/webpack/json-loader + */ + { + test: /\.json$/, + loader: 'json-loader', + exclude: [helpers.root('src/index.html')] + }, + + /** + * Raw loader support for *.css files + * Returns file content as string + * + * See: https://github.com/webpack/raw-loader + */ + { + test: /\.css$/, + loader: ['to-string-loader', 'css-loader'], + exclude: [helpers.root('src/index.html')] + }, + + /** + * Raw loader support for *.scss files + * + * See: https://github.com/webpack/raw-loader + */ + { + test: /\.scss$/, + loader: ['raw-loader', 'sass-loader'], + exclude: [helpers.root('src/index.html')] + }, + + /** + * Raw loader support for *.html + * Returns file content as string + * + * See: https://github.com/webpack/raw-loader + */ + { + test: /\.html$/, + loader: 'raw-loader', + exclude: [helpers.root('src/index.html')] + }, + + /** + * Instruments JS files with Istanbul for subsequent code coverage reporting. + * Instrument only testing sources. + * + * See: https://github.com/deepsweet/istanbul-instrumenter-loader + */ + { + enforce: 'post', + test: /\.(js|ts)$/, + loader: 'istanbul-instrumenter-loader', + include: helpers.root('src'), + exclude: [ + /\.(e2e|spec)\.ts$/, + /node_modules/ + ] + } + + ] + }, + + /** + * Add additional plugins to the compiler. + * + * See: http://webpack.github.io/docs/configuration.html#plugins + */ + plugins: [ + + /** + * Plugin: DefinePlugin + * Description: Define free variables. + * Useful for having development builds with debug logging or adding global constants. + * + * Environment helpers + * + * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin + */ + // NOTE: when adding more properties make sure you include them in custom-typings.d.ts + new DefinePlugin({ + 'ENV': JSON.stringify(ENV), + 'HMR': false, + 'process.env': { + 'ENV': JSON.stringify(ENV), + 'NODE_ENV': JSON.stringify(ENV), + 'HMR': false, + } + }), + + /** + * Plugin: ContextReplacementPlugin + * Description: Provides context to Angular's use of System.import + * + * See: https://webpack.github.io/docs/list-of-plugins.html#contextreplacementplugin + * See: https://github.com/angular/angular/issues/11580 + */ + new ContextReplacementPlugin( + // The (\\|\/) piece accounts for path separators in *nix and Windows + /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/, + helpers.root('src'), // location of your src + { + // your Angular Async Route paths relative to this root directory + } + ), + + /** + * Plugin LoaderOptionsPlugin (experimental) + * + * See: https://gist.github.com/sokra/27b24881210b56bbaff7 + */ + new LoaderOptionsPlugin({ + debug: false, + options: { + // legacy options go here + } + }), + + ], + /** + * Include polyfills or mocks for various node stuff + * Description: Node configuration + * + * See: https://webpack.github.io/docs/configuration.html#node + */ + node: { + global: true, + process: false, + crypto: 'empty', + module: false, + clearImmediate: false, + setImmediate: false + } + + }; +} diff --git a/electron/webpack/config/helpers.ts b/electron/webpack/config/helpers.ts deleted file mode 100644 index 6eb38186c..000000000 --- a/electron/webpack/config/helpers.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as path from 'path'; -import Config from '../../../tools/config'; - -const EVENT = process.env.npm_lifecycle_event || ''; -var ROOT = path.resolve(Config.ELECTRON_BASE_DIR); - -export function hasProcessFlag(flag) { - return process.argv.join('').indexOf(flag) > -1; -} - -export function hasNpmFlag(flag) { - return EVENT.includes(flag); -} - -export function isWebpackDevServer() { - return process.argv[1] && !! (/webpack-dev-server/.exec(process.argv[1])); -} - -export var root = path.join.bind(path, ROOT); - diff --git a/electron/webpack/config/webpack.common.ts b/electron/webpack/config/webpack.common.ts deleted file mode 100644 index 1b250033b..000000000 --- a/electron/webpack/config/webpack.common.ts +++ /dev/null @@ -1,256 +0,0 @@ -import Config from '../../../tools/config'; -const helpers = require('./helpers'); -const webpackMerge = require('webpack-merge'); // used to merge webpack configs -const webpackMergeDll = webpackMerge.strategy({plugins: 'replace'}); -const commonConfig = require('./webpack.common.js'); // the settings that are common to prod and dev - -/** - * Webpack Plugins - */ -const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin'); -const DefinePlugin = require('webpack/lib/DefinePlugin'); -const NamedModulesPlugin = require('webpack/lib/NamedModulesPlugin'); -const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); - -/** - * Webpack Constants - */ -const ENV = Config.BUILD_TYPE = process.env.ENV = process.env.NODE_ENV = 'development'; -const HOST = process.env.HOST || 'localhost'; -const PORT = process.env.PORT || 3000; -const HMR = helpers.hasProcessFlag('hot'); -const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, { - host: HOST, - port: PORT, - ENV: ENV, - HMR: HMR -}); - - -const DllBundlesPlugin = require('webpack-dll-bundles-plugin').DllBundlesPlugin; - -/** - * Webpack configuration - * - * See: http://webpack.github.io/docs/configuration.html#cli - */ -module.exports = function (options) { - return webpackMerge(commonConfig({env: ENV}), { - - - /** - * Developer tool to enhance debugging - * - * See: http://webpack.github.io/docs/configuration.html#devtool - * See: https://github.com/webpack/docs/wiki/build-performance#sourcemaps - */ - devtool: 'cheap-module-source-map', - - /** - * Options affecting the output of the compilation. - * - * See: http://webpack.github.io/docs/configuration.html#output - */ - output: { - - /** - * The output directory as absolute path (required). - * - * See: http://webpack.github.io/docs/configuration.html#output-path - */ - path: helpers.root(Config.APP_DEST), - - /** - * Specifies the name of each output file on disk. - * IMPORTANT: You must not specify an absolute path here! - * - * See: http://webpack.github.io/docs/configuration.html#output-filename - */ - filename: '[name].bundle.js', - - /** - * The filename of the SourceMaps for the JavaScript files. - * They are inside the output.path directory. - * - * See: http://webpack.github.io/docs/configuration.html#output-sourcemapfilename - */ - sourceMapFilename: '[file].map', - - /** The filename of non-entry chunks as relative path - * inside the output.path directory. - * - * See: http://webpack.github.io/docs/configuration.html#output-chunkfilename - */ - chunkFilename: '[id].chunk.js', - - library: 'ac_[name]', - libraryTarget: 'var', - }, - - module: { - - rules: [ - { - test: /\.ts$/, - use: [ - { - loader: 'tslint-loader', - options: { - configFile: 'tslint.json' - } - } - ], - exclude: [/\.(spec|e2e)\.ts$/] - }, - - /* - * css loader support for *.css files (styles directory only) - * Loads external css styles into the DOM, supports HMR - * - */ - { - test: /\.css$/, - use: ['style-loader', 'css-loader'], - include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.css' )] - }, - - /* - * sass loader support for *.scss files (styles directory only) - * Loads external sass styles into the DOM, supports HMR - * - */ - { - test: /\.scss$/, - use: ['style-loader', 'css-loader', 'sass-loader'], - include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.scss')] - }, - - ] - - }, - - plugins: [ - - /** - * Plugin: DefinePlugin - * Description: Define free variables. - * Useful for having development builds with debug logging or adding global constants. - * - * Environment helpers - * - * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin - */ - // NOTE: when adding more properties, make sure you include them in custom-typings.d.ts - new DefinePlugin({ - 'ENV': JSON.stringify(METADATA.ENV), - 'HMR': METADATA.HMR, - 'process.env': { - 'ENV': JSON.stringify(METADATA.ENV), - 'NODE_ENV': JSON.stringify(METADATA.ENV), - 'HMR': METADATA.HMR, - } - }), - - new DllBundlesPlugin({ - bundles: { - polyfills: [ - 'core-js', - { - name: 'zone.js', - path: 'zone.js/dist/zone.js' - }, - { - name: 'zone.js', - path: 'zone.js/dist/long-stack-trace-zone.js' - }, - ], - vendor: [ - '@angular/platform-browser', - '@angular/platform-browser-dynamic', - '@angular/core', - '@angular/common', - '@angular/forms', - '@angular/http', - '@angular/router', - '@angularclass/hmr', - 'rxjs', - ] - }, - dllDir: helpers.root('dll'), - webpackConfig: webpackMergeDll(commonConfig({env: ENV}), { - devtool: 'cheap-module-source-map', - plugins: [] - }) - }), - - /** - * Plugin: AddAssetHtmlPlugin - * Description: Adds the given JS or CSS file to the files - * Webpack knows about, and put it into the list of assets - * html-webpack-plugin injects into the generated html. - * - * See: https://github.com/SimenB/add-asset-html-webpack-plugin - */ - new AddAssetHtmlPlugin([ - { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('polyfills')}`) }, - { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('vendor')}`) } - ]), - - /** - * Plugin: NamedModulesPlugin (experimental) - * Description: Uses file names as module name. - * - * See: https://github.com/webpack/webpack/commit/a04ffb928365b19feb75087c63f13cadfc08e1eb - */ - // new NamedModulesPlugin(), - - /** - * Plugin LoaderOptionsPlugin (experimental) - * - * See: https://gist.github.com/sokra/27b24881210b56bbaff7 - */ - new LoaderOptionsPlugin({ - debug: true, - options: { - - } - }), - - ], - - /** - * Webpack Development Server configuration - * Description: The webpack-dev-server is a little node.js Express server. - * The server emits information about the compilation state to the client, - * which reacts to those events. - * - * See: https://webpack.github.io/docs/webpack-dev-server.html - */ - devServer: { - port: METADATA.port, - host: METADATA.host, - historyApiFallback: true, - watchOptions: { - aggregateTimeout: 300, - poll: 1000 - } - }, - - /* - * Include polyfills or mocks for various node stuff - * Description: Node configuration - * - * See: https://webpack.github.io/docs/configuration.html#node - */ - node: { - global: true, - crypto: 'empty', - process: true, - module: false, - clearImmediate: false, - setImmediate: false - } - - }); -}; - diff --git a/electron/webpack/config/webpack.dev.ts b/electron/webpack/config/webpack.dev.ts deleted file mode 100644 index bcd059211..000000000 --- a/electron/webpack/config/webpack.dev.ts +++ /dev/null @@ -1,254 +0,0 @@ -import Config from '../../../tools/config'; -const helpers = require('./helpers'); -const webpackMerge = require('webpack-merge'); // used to merge webpack configs -const webpackMergeDll = webpackMerge.strategy({plugins: 'replace'}); -const commonConfig = require('./webpack.common.js'); // the settings that are common to prod and dev - -/** - * Webpack Plugins - */ -const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin'); -const DefinePlugin = require('webpack/lib/DefinePlugin'); -const NamedModulesPlugin = require('webpack/lib/NamedModulesPlugin'); -const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); - -/** - * Webpack Constants - */ -const ENV = Config.BUILD_TYPE = process.env.ENV = process.env.NODE_ENV = 'development'; -const HOST = process.env.HOST || 'localhost'; -const PORT = process.env.PORT || 3000; -const HMR = helpers.hasProcessFlag('hot'); -const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, { - host: HOST, - port: PORT, - ENV: ENV, - HMR: HMR -}); - - -const DllBundlesPlugin = require('webpack-dll-bundles-plugin').DllBundlesPlugin; - -/** - * Webpack configuration - * - * See: http://webpack.github.io/docs/configuration.html#cli - */ -module.exports = function (options) { - return webpackMerge(commonConfig({env: ENV}), { - - /** - * Developer tool to enhance debugging - * - * See: http://webpack.github.io/docs/configuration.html#devtool - * See: https://github.com/webpack/docs/wiki/build-performance#sourcemaps - */ - devtool: 'cheap-module-source-map', - - /** - * Options affecting the output of the compilation. - * - * See: http://webpack.github.io/docs/configuration.html#output - */ - output: { - - /** - * The output directory as absolute path (required). - * - * See: http://webpack.github.io/docs/configuration.html#output-path - */ - path: helpers.root(Config.APP_DEST), - - /** - * Specifies the name of each output file on disk. - * IMPORTANT: You must not specify an absolute path here! - * - * See: http://webpack.github.io/docs/configuration.html#output-filename - */ - filename: '[name].bundle.js', - - /** - * The filename of the SourceMaps for the JavaScript files. - * They are inside the output.path directory. - * - * See: http://webpack.github.io/docs/configuration.html#output-sourcemapfilename - */ - sourceMapFilename: '[file].map', - - /** The filename of non-entry chunks as relative path - * inside the output.path directory. - * - * See: http://webpack.github.io/docs/configuration.html#output-chunkfilename - */ - chunkFilename: '[id].chunk.js', - - library: 'ac_[name]', - libraryTarget: 'var', - }, - - module: { - - rules: [ - { - test: /\.ts$/, - use: [ - { - loader: 'tslint-loader', - options: { - configFile: 'tslint.json' - } - } - ], - exclude: [/\.(spec|e2e)\.ts$/] - }, - - /* - * css loader support for *.css files (styles directory only) - * Loads external css styles into the DOM, supports HMR - * - */ - { - test: /\.css$/, - use: ['style-loader', 'css-loader'], - include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.css')] - }, - - /* - * sass loader support for *.scss files (styles directory only) - * Loads external sass styles into the DOM, supports HMR - * - */ - { - test: /\.scss$/, - use: ['style-loader', 'css-loader', 'sass-loader'], - include: [helpers.root(Config.ELECTRON_APP_SRC, '**', '*.scss')] - }, - - ] - - }, - - plugins: [ - - /** - * Plugin: DefinePlugin - * Description: Define free variables. - * Useful for having development builds with debug logging or adding global constants. - * - * Environment helpers - * - * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin - */ - // NOTE: when adding more properties, make sure you include them in custom-typings.d.ts - new DefinePlugin({ - 'ENV': JSON.stringify(METADATA.ENV), - 'HMR': METADATA.HMR, - 'process.env': { - 'ENV': JSON.stringify(METADATA.ENV), - 'NODE_ENV': JSON.stringify(METADATA.ENV), - 'HMR': METADATA.HMR, - } - }), - - new DllBundlesPlugin({ - bundles: { - polyfills: [ - 'core-js', - { - name: 'zone.js', - path: 'zone.js/dist/zone.js' - }, - { - name: 'zone.js', - path: 'zone.js/dist/long-stack-trace-zone.js' - }, - ], - vendor: [ - '@angular/platform-browser', - '@angular/platform-browser-dynamic', - '@angular/core', - '@angular/common', - '@angular/forms', - '@angular/http', - '@angular/router', - '@angularclass/hmr', - 'rxjs', - ] - }, - dllDir: helpers.root('dll'), - webpackConfig: webpackMergeDll(commonConfig({env: ENV}), { - devtool: 'cheap-module-source-map', - plugins: [] - }) - }), - - /** - * Plugin: AddAssetHtmlPlugin - * Description: Adds the given JS or CSS file to the files - * Webpack knows about, and put it into the list of assets - * html-webpack-plugin injects into the generated html. - * - * See: https://github.com/SimenB/add-asset-html-webpack-plugin - */ - new AddAssetHtmlPlugin([ - { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('polyfills')}`) }, - { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('vendor')}`) } - ]), - - /** - * Plugin: NamedModulesPlugin (experimental) - * Description: Uses file names as module name. - * - * See: https://github.com/webpack/webpack/commit/a04ffb928365b19feb75087c63f13cadfc08e1eb - */ - // new NamedModulesPlugin(), - - /** - * Plugin LoaderOptionsPlugin (experimental) - * - * See: https://gist.github.com/sokra/27b24881210b56bbaff7 - */ - new LoaderOptionsPlugin({ - debug: true, - options: { - - } - }), - - ], - - /** - * Webpack Development Server configuration - * Description: The webpack-dev-server is a little node.js Express server. - * The server emits information about the compilation state to the client, - * which reacts to those events. - * - * See: https://webpack.github.io/docs/webpack-dev-server.html - */ - devServer: { - port: METADATA.port, - host: METADATA.host, - historyApiFallback: true, - watchOptions: { - aggregateTimeout: 300, - poll: 1000 - } - }, - - /* - * Include polyfills or mocks for various node stuff - * Description: Node configuration - * - * See: https://webpack.github.io/docs/configuration.html#node - */ - node: { - global: true, - crypto: 'empty', - process: true, - module: false, - clearImmediate: false, - setImmediate: false - } - - }); -} \ No newline at end of file diff --git a/electron/webpack/config/webpack.prod.ts b/electron/webpack/config/webpack.prod.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/electron/webpack/config/webpack.test.ts b/electron/webpack/config/webpack.test.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/tools/tasks/seed/build.elec.config.ts b/tools/tasks/seed/build.elec.config.ts index 349350129..e5de2991f 100644 --- a/tools/tasks/seed/build.elec.config.ts +++ b/tools/tasks/seed/build.elec.config.ts @@ -66,6 +66,6 @@ export = // relative(file.path, Config.PROJECT_ROOT + '/' + Config.APP_SRC).replace(sep, '/') + '/' + Config.APP_SRC // })) .pipe(plugins.template(new TemplateLocalsBuilder().withStringifiedSystemConfigDev().build())) - .pipe(gulp.dest(Config.ELECTRON_BASE_DIR)); + .pipe(gulp.dest(join(Config.ELECTRON_BASE_DIR,'config'))); } }; From 8c4c8bce01f8c407ece627c6926678334b35b98a Mon Sep 17 00:00:00 2001 From: ianm Date: Thu, 30 Mar 2017 23:26:14 -0400 Subject: [PATCH 14/17] more cleanup and loader started --- electron/src/_common.scss | 0 electron/src/app.scss | 0 electron/src/app.ts | 7 ++ electron/src/electron.module.ts | 100 +++++++++++++++++++++++ electron/src/polyfills.ts | 0 electron/src/vendor.ts | 7 ++ electron/tools/webpack/elec.loader.js | 112 ++++++++++++++++++++++++++ electron/webpack.config.js | 2 +- 8 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 electron/src/_common.scss create mode 100644 electron/src/app.scss create mode 100644 electron/src/app.ts create mode 100644 electron/src/electron.module.ts create mode 100644 electron/src/polyfills.ts create mode 100644 electron/src/vendor.ts create mode 100644 electron/tools/webpack/elec.loader.js diff --git a/electron/src/_common.scss b/electron/src/_common.scss new file mode 100644 index 000000000..e69de29bb diff --git a/electron/src/app.scss b/electron/src/app.scss new file mode 100644 index 000000000..e69de29bb diff --git a/electron/src/app.ts b/electron/src/app.ts new file mode 100644 index 000000000..8db53d358 --- /dev/null +++ b/electron/src/app.ts @@ -0,0 +1,7 @@ +// nativescript +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +// app +import { ElectronModule } from './electron.module'; + +platformBrowserDynamic().bootstrapModule(ElectronModule); diff --git a/electron/src/electron.module.ts b/electron/src/electron.module.ts new file mode 100644 index 000000000..d3b7728a5 --- /dev/null +++ b/electron/src/electron.module.ts @@ -0,0 +1,100 @@ +// angular +import { NgModule } from '@angular/core'; +import { APP_BASE_HREF } from '@angular/common'; +import { BrowserModule } from '@angular/platform-browser'; +import { RouterModule } from '@angular/router'; +import { Http } from '@angular/http'; + +// libs +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; +import { StoreDevtoolsModule } from '@ngrx/store-devtools'; +import { TranslateLoader } from '@ngx-translate/core'; + +// app +import { APP_COMPONENTS, AppComponent } from './app/components/index'; +import { routes } from './app/components/app.routes'; + +// feature modules +import { CoreModule } from './app/shared/core/core.module'; +import { AppReducer } from './app/shared/ngrx/index'; +import { AnalyticsModule } from './app/shared/analytics/analytics.module'; +import { MultilingualModule, translateLoaderFactory } from './app/shared/i18n/multilingual.module'; +import { MultilingualEffects } from './app/shared/i18n/index'; +import { SampleModule } from './app/shared/sample/sample.module'; +import { NameListEffects } from './app/shared/sample/index'; + +// config +import { Config, WindowService, ConsoleService } from './app/shared/core/index'; +Config.PLATFORM_TARGET = Config.PLATFORMS.WEB; +if (String('<%= BUILD_TYPE %>') === 'dev') { + // only output console logging in dev mode + Config.DEBUG.LEVEL_4 = true; +} + +// sample config (extra) +import { AppConfig } from './app/shared/sample/services/app-config'; +import { MultilingualService } from './app/shared/i18n/services/multilingual.service'; +// custom i18n language support +MultilingualService.SUPPORTED_LANGUAGES = AppConfig.SUPPORTED_LANGUAGES; + +let routerModule = RouterModule.forRoot(routes); + +if (String('<%= TARGET_DESKTOP %>') === 'true') { + Config.PLATFORM_TARGET = Config.PLATFORMS.DESKTOP; + // desktop (electron) must use hash + routerModule = RouterModule.forRoot(routes, {useHash: true}); +} + +declare var window, console; + +// For AoT compilation to work: +export function win() { + return window; +} +export function cons() { + return console; +} + +let DEV_IMPORTS: any[] = []; + +if (String('<%= BUILD_TYPE %>') === 'dev') { + DEV_IMPORTS = [ + ...DEV_IMPORTS, + StoreDevtoolsModule.instrumentOnlyWithExtension() + ]; +} + +@NgModule({ + imports: [ + BrowserModule, + CoreModule.forRoot([ + { provide: WindowService, useFactory: (win) }, + { provide: ConsoleService, useFactory: (cons) } + ]), + routerModule, + AnalyticsModule, + MultilingualModule.forRoot([{ + provide: TranslateLoader, + deps: [Http], + useFactory: (translateLoaderFactory) + }]), + SampleModule, + StoreModule.provideStore(AppReducer), + DEV_IMPORTS, + EffectsModule.run(MultilingualEffects), + EffectsModule.run(NameListEffects) + ], + declarations: [ + APP_COMPONENTS + ], + providers: [ + { + provide: APP_BASE_HREF, + useValue: '<%= APP_BASE %>' + } + ], + bootstrap: [AppComponent] +}) + +export class ElectronModule { } diff --git a/electron/src/polyfills.ts b/electron/src/polyfills.ts new file mode 100644 index 000000000..e69de29bb diff --git a/electron/src/vendor.ts b/electron/src/vendor.ts new file mode 100644 index 000000000..1249bbf98 --- /dev/null +++ b/electron/src/vendor.ts @@ -0,0 +1,7 @@ +require('reflect-metadata'); +require('@angular/platform-browser'); +require('@angular/core'); +require('@angular/common'); +require('@angular/forms'); +require('@angular/http'); +require('@angular/router'); diff --git a/electron/tools/webpack/elec.loader.js b/electron/tools/webpack/elec.loader.js new file mode 100644 index 000000000..7ab47d0db --- /dev/null +++ b/electron/tools/webpack/elec.loader.js @@ -0,0 +1,112 @@ +const fs = require('fs-extra'); +const loaderUtils = require('loader-utils');; +const _ = require('lodash'); +const template = _.template; + +const htmlCssRegexp = /\.component\.(html|css)/; +const htmlCssReplaceStr = '.component.elec.\$1'; +const serviceRegexp = /\.service\.(ts|js)/; +const serviceReplaceStr = '.service.elec.\$1'; +const componentRegexp = /\.component\.(ts|js)/; +const componentReplaceStr = '.component.elec.\$1'; +const componentFactoryRegexp = /\.component\.ngfactory\.(ts|js)/; + +const ng2TemplateUrlRegex = /templateUrl *:(.*)$/gm; +const ng2StyleUrlsRegex = /styleUrls *:(\s*\[[^\]]*?\])/g; +const ng2StringReplaceRegexp = /(['"])((?:[^\\]\\\1|.)*?)\1/g; +const ng2ModuleIdRegexp = /(moduleId *: *module\.id,)$/gm; + +function replaceViewStringsWithRequires(string) { + return string.replace(ng2StringReplaceRegexp, function (match, quote, url) { + if (url.charAt(0) !== '.') { + url = './' + url; + } + + const elecViewPath = url.replace(htmlCssRegexp, htmlCssReplaceStr); + if (fs.existsSync(elecViewPath)) { + return 'require(\'' + elecViewPath + '\')'; + } + + return 'require(\'' + url + '\')'; + }); +} + +function replaceServiceStringsWithRequires(string) { + return string.replace(ng2StringReplaceRegexp, function (match, quote, url) { + if (url.charAt(0) !== '.') { + url = './' + url; + } + + const elecSvcPath = url.replace(serviceRegexp, serviceReplaceStr); + if (fs.existsSync(elecSvcPath)) { + return 'require(\'' + elecSvcPath + '\')'; + } + + return 'require(\'' + url + '\')'; + }); +} + +function replaceComponentStringsWithRequires(string) { + return string.replace(ng2StringReplaceRegexp, function (match, quote, url) { + if (url.charAt(0) !== '.') { + url = './' + url; + } + + const elecCmpPath = url.replace(serviceRegexp, serviceReplaceStr); + if (fs.existsSync(elecCmpPath)) { + return 'require(\'' + elecCmpPath + '\')'; + } + + return 'require(\'' + url + '\')'; + }); +} + +function injectTemplateVariables(loaderContext, source) { + // Inject template variables via lodash.template + // Note: We only support the '' syntax (default matches and breaks on es6 string literals). + const query = loaderUtils.getOptions(loaderContext); + + const tpl = template(source, { + interpolate: /<%=([\s\S]+?)%>/g, + }); + + return tpl(query.data); +} + +module.exports = function tnsLoader(source) { + if (this.resourcePath.match(htmlCssRegexp)) { + // If a tns-version of the html/css file exists, replace the source with the content of that file. + const elecViewPath = this.resourcePath.replace(htmlCssRegexp, htmlCssReplaceStr); + // If a electron-version of the service file exists, replace the source with the content of that file. + const elecSvcPath = this.resourcePath.replace(serviceRegexp, serviceReplaceStr); + // If a electron-version of the component file exists, replace the source with the content of that file. + const elecCmpPath = this.resourcePath.replace(componentRegexp, componentReplaceStr); + if (fs.existsSync(elecViewPath)) { + const tnsSource = fs.readFileSync(tnsPath, 'UTF-8'); + source = 'module.exports = ' + JSON.stringify(tnsSource); + } + //todo: need to handle other electron specifics.... + } else if (this.resourcePath.match(componentRegexp)) { + // For ng2 components cnnvert: + // styleUrls = ['file1', ..., fileN] => styles = [require('file1'), ..., require('fileN')] + // templateUrl: 'file' => template: require('file') + // + // Removes moduleId + const styleProperty = 'styles'; + const templateProperty = 'template'; + + source = source.replace(ng2TemplateUrlRegex, function replaceTemplateUrl(match, url) { + return templateProperty + ':' + replaceStringsWithRequires(url); + }) + .replace(ng2StyleUrlsRegex, function replaceStyleUrls(match, urls) { + return styleProperty + ':' + replaceStringsWithRequires(urls); + }) + .replace(ng2ModuleIdRegexp, function moduleId(match, moduleId) { + return '/* ' + moduleId + ' */'; + }); + } else if (this.resourcePath.match(componentFactoryRegexp)) { + // TODO: should/could we do something with the NgFactory files? + } + + return injectTemplateVariables(this, source); +}; \ No newline at end of file diff --git a/electron/webpack.config.js b/electron/webpack.config.js index 8f4f4bc61..c9a02bcf3 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -22,7 +22,7 @@ var config = { entry: { 'polyfills': './src/polyfills.ts', 'vendor': './src/vendor.ts', - 'app': './src/app/app', + 'app': './src/app.ts', }, // Config for our build files From 1fa5fbb1e9e4267800ac6e9ab223df5cca116277 Mon Sep 17 00:00:00 2001 From: ianm Date: Fri, 31 Mar 2017 10:11:32 -0400 Subject: [PATCH 15/17] electron target & loader --- .../{elec.loader.js => elec-loader.js} | 55 ++- electron/webpack.config.js | 319 ++++++++++-------- package.json | 1 + 3 files changed, 225 insertions(+), 150 deletions(-) rename electron/tools/webpack/{elec.loader.js => elec-loader.js} (70%) diff --git a/electron/tools/webpack/elec.loader.js b/electron/tools/webpack/elec-loader.js similarity index 70% rename from electron/tools/webpack/elec.loader.js rename to electron/tools/webpack/elec-loader.js index 7ab47d0db..127e57cc2 100644 --- a/electron/tools/webpack/elec.loader.js +++ b/electron/tools/webpack/elec-loader.js @@ -74,18 +74,43 @@ function injectTemplateVariables(loaderContext, source) { } module.exports = function tnsLoader(source) { - if (this.resourcePath.match(htmlCssRegexp)) { - // If a tns-version of the html/css file exists, replace the source with the content of that file. - const elecViewPath = this.resourcePath.replace(htmlCssRegexp, htmlCssReplaceStr); + if (this.resourcePath.match(elecSvcPath)) { // If a electron-version of the service file exists, replace the source with the content of that file. const elecSvcPath = this.resourcePath.replace(serviceRegexp, serviceReplaceStr); + if (fs.existsSync(elecSvcPath)) { + const elecSvcSource = fs.readFileSync(elecSvcPath, 'UTF-8'); + source = 'module.exports == ' + JSON.stringify(elecSvcSource); + } + } + if (this.resourcePath.math(elecCmpPath)) { // If a electron-version of the component file exists, replace the source with the content of that file. const elecCmpPath = this.resourcePath.replace(componentRegexp, componentReplaceStr); + if (fs.existsSync(elecCmpPath)) { + const elecCmpSource = fs.readFileSync(elecCmpPath, 'UTF-8'); + source = 'module.exports = ' + JSON.stringify(elecCmpSource); + //Replace module.id needed?? + const styleProperty = 'styles'; + const templateProperty = 'template'; + + source = source.replace(ng2TemplateUrlRegex, function replaceTemplateUrl(match, url) { + return templateProperty + ':' + replaceStringsWithRequires(url); + }) + .replace(ng2StyleUrlsRegex, function replaceStyleUrls(match, urls) { + return styleProperty + ':' + replaceStringsWithRequires(urls); + }) + .replace(ng2ModuleIdRegexp, function moduleId(match, moduleId) { + return '/* ' + moduleId + ' */'; + }); + } + } + if (this.resourcePath.match(htmlCssRegexp)) { + // If a tns-version of the html/css file exists, replace the source with the content of that file. + const elecViewPath = this.resourcePath.replace(htmlCssRegexp, htmlCssReplaceStr); if (fs.existsSync(elecViewPath)) { - const tnsSource = fs.readFileSync(tnsPath, 'UTF-8'); - source = 'module.exports = ' + JSON.stringify(tnsSource); + const elecViewSource = fs.readFileSync(elecViewPath, 'UTF-8'); + source = 'module.exports = ' + JSON.stringify(elecViewSource); } - //todo: need to handle other electron specifics.... + } else if (this.resourcePath.match(componentRegexp)) { // For ng2 components cnnvert: // styleUrls = ['file1', ..., fileN] => styles = [require('file1'), ..., require('fileN')] @@ -96,17 +121,17 @@ module.exports = function tnsLoader(source) { const templateProperty = 'template'; source = source.replace(ng2TemplateUrlRegex, function replaceTemplateUrl(match, url) { - return templateProperty + ':' + replaceStringsWithRequires(url); - }) - .replace(ng2StyleUrlsRegex, function replaceStyleUrls(match, urls) { - return styleProperty + ':' + replaceStringsWithRequires(urls); - }) - .replace(ng2ModuleIdRegexp, function moduleId(match, moduleId) { - return '/* ' + moduleId + ' */'; - }); + return templateProperty + ':' + replaceStringsWithRequires(url); + }) + .replace(ng2StyleUrlsRegex, function replaceStyleUrls(match, urls) { + return styleProperty + ':' + replaceStringsWithRequires(urls); + }) + .replace(ng2ModuleIdRegexp, function moduleId(match, moduleId) { + return '/* ' + moduleId + ' */'; + }); } else if (this.resourcePath.match(componentFactoryRegexp)) { // TODO: should/could we do something with the NgFactory files? } return injectTemplateVariables(this, source); -}; \ No newline at end of file +}; diff --git a/electron/webpack.config.js b/electron/webpack.config.js index c9a02bcf3..8cc0d4428 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -1,150 +1,199 @@ -// @joaogarin - -/* - * Helper: root(), and rootDir() are defined at the bottom - */ -const webpack = require('webpack'); -const helpers = require('./helpers'); -const path = require('path'); - +var webpack = require('webpack'); +//var nsWebpack = require('nativescript-dev-webpack'); +//var nativescriptTarget = require('nativescript-dev-webpack/nativescript-target'); +var path = require('path'); var CopyWebpackPlugin = require('copy-webpack-plugin'); -const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +//var AotPlugin = require('@ngtools/webpack').AotPlugin; -/* - * Config - */ -var config = { - // for faster builds use 'eval' - devtool: 'source-map', - // cache: false, +module.exports = function(platform, destinationApp) { + if (!destinationApp) { + //Default destination inside platforms//... + destinationApp = nsWebpack.getAppPath(platform); + } - // our angular app - entry: { - 'polyfills': './src/polyfills.ts', - 'vendor': './src/vendor.ts', - 'app': './src/app.ts', + // Setup the tnsLoader + var elecLoader = { + loader: 'elec-loader', + options: { + // data file is for now generated by the 'gulp build.js.tns'-task. + //data: require('./app/build-config.json'), }, + }; + + var entry = {}; + //Discover entry module from package.json + entry.bundle = './app.ts' + //Vendor entry with third party libraries. + entry.vendor = './vendor.ts'; + //app.css bundle + entry['app.css'] = './app.css'; + + var plugins = [ + new ExtractTextPlugin('app.css'), + //Vendor libs go to the vendor.js chunk + new webpack.optimize.CommonsChunkPlugin({ + name: ['vendor'] + }), + //Define useful constants like TNS_WEBPACK + // new webpack.DefinePlugin({ + // global: 'global', + // __dirname: '__dirname', + // 'global.TNS_WEBPACK': 'true', + // }), + //Copy assets to out dir. Add your own globs as needed. + new CopyWebpackPlugin([{ + from: 'app.css', + to: 'app.css' + }, { + from: 'css/**' + }, { + from: 'fonts/**' + }, { + from: '**/*.jpg' + }, { + from: '**/*.png' + }, { + from: '**/*.xml' + }, { + from: 'assets', + to: 'assets', + type: 'dir', + }, ], { + ignore: [] + }), + //Generate a bundle starter script and activate it in package.json + // new nsWebpack.GenerateBundleStarterPlugin([ + // './vendor', + // './bundle', + // ]), + + // Exclude explicitly required but never declared in XML elements. + // Loader nativescript-dev-webpack/tns-xml-loader should be added for *.xml/html files. + //new nsWebpack.ExcludeUnusedElementsPlugin(), - // Config for our build files + //Angular AOT compiler + // new AotPlugin({ + // tsConfigPath: 'tsconfig.aot.json', + // entryModule: path.resolve(__dirname, 'app/electron.module#ElectronModule'), + // typeChecking: false + // }), + // new nsWebpack.StyleUrlResolvePlugin({ + // platform + // }), + ]; + +// if (process.env.npm_config_uglify) { +// //Work around an Android issue by setting compress = false +// var compress = platform !== 'android'; +// plugins.push(new webpack.optimize.UglifyJsPlugin({ +// mangle: { +// except: nsWebpack.uglifyMangleExcludes, +// }, +// compress: compress, +// })); +// } + + return { + context: path.resolve('./src/app'), + target: 'electron-renderer', + entry: entry, output: { - path: helpers.root('src/app/dist'), - filename: '[name].js', - sourceMapFilename: '[name].map', - chunkFilename: '[id].chunk.js' + pathinfo: true, + path: path.resolve('./app'), + libraryTarget: 'commonjs2', + filename: '[name].js', }, - /* - * Options affecting the resolving of modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve - */ resolve: { - /* - * An array of extensions that should be used to resolve modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve-extensions - */ - extensions: ['.ts', '.js', '.json', '.css', '.html'], - - // An array of directory names to be resolved to the current directory - modules: [helpers.root('src'), 'node_modules'], - + //Resolve platform-specific modules like module.android.js + extensions: [ + '.aot.ts', + '.ts', + '.js', + '.css', + ], + //Resolve {N} system modules from tns-core-modules + modules: [ + 'node_modules/tns-core-modules', + 'node_modules' + ] + }, + resolveLoader: { + alias: { + 'elec-loader': path.join(__dirname, 'tools', 'webpack', 'elec-loader.js'), + } }, - /* - * Options affecting the resolving of modules. - * - * See: http://webpack.github.io/docs/configuration.html#resolve - */ + // node: { + // //Disable node shims that conflict with NativeScript + // 'http': false, + // 'timers': false, + // 'setImmediate': false, + // }, module: { - rules: [ - // Support for .ts files. - { - test: /\.ts$/, - loaders: ['awesome-typescript-loader', 'angular2-template-loader'], - exclude: [/\.(spec|e2e)\.ts$/] - }, + rules: [{ + test: /\.html$|\.xml$/, + use: [ + elecLoader, + 'raw-loader', + //'nativescript-dev-webpack/tns-xml-loader' + ] + }, + // Root app.css file gets extracted with bundled dependencies + { + test: /app\.css$/, + use: ExtractTextPlugin.extract([ + 'resolve-url-loader', + //'nativescript-css-loader', + //'nativescript-dev-webpack/platform-css-loader', + ]), + }, + // Other CSS files get bundled using the raw loader + { + test: /\.css$/, + exclude: /app\.css$/, + use: [ + elecLoader, + 'raw-loader', + ] + }, + // Compile TypeScript files with ahead-of-time compiler. + { + test: /\.ts$/, + use: [ + elecLoader, + //'nativescript-dev-webpack/tns-aot-loader', + //'@ngtools/webpack', + ] + }, - // Support for *.json files. - { - test: /\.json$/, - loader: 'json-loader' - }, - { - test: /\.scss$/, - exclude: /node_modules/, - loaders: ['raw-loader', 'sass-loader'] // sass-loader not scss-loader - }, - - // support for .html antd .css as raw text - { - test: /\.html$/, - loader: 'raw-loader', - exclude: [helpers.root('app/index.html')] - }, + /* + * Json loader support for *.json files. + * + * See: https://github.com/webpack/json-loader + */ + { + test: /\.json$/, + use: 'json-loader' + }, - // support for fonts - { - test: /\.(ttf|eot|svg|woff(2)?)(\?[a-z0-9=&.]+)?$/, - loader: 'file-loader?name=dist/[name]-[hash].[ext]' - }, + // SASS support + { + test: /\.scss$/, + use: [ + 'raw-loader', + 'resolve-url-loader', + 'sass-loader' + ] + }, - // support for svg icons - { - test: /\.svg/, - loader: 'svg-url-loader' - } - ] + /* File loader for supporting images, for example, in CSS files. + */ + { + test: /\.(jpg|png|gif)$/, + use: 'file-loader' + } + ] }, - plugins: [ - - // Plugin: CommonsChunkPlugin - // Description: Shares common code between the pages. - // It identifies common modules and put them into a commons chunk. - // - // See: https://webpack.github.io/docs/list-of-plugins.html#commonschunkplugin - // See: https://github.com/webpack/docs/wiki/optimization#multi-page-app - new webpack.optimize.CommonsChunkPlugin({ name: ['vendor', 'polyfills'], minChunks: Infinity }), - // Plugin: CopyWebpackPlugin - // Description: Copy files and directories in webpack. - // - // Copies project static assets. - // - // See: https://www.npmjs.com/package/copy-webpack-plugin - new CopyWebpackPlugin([{ from: 'src/assets', to: 'assets' }]), - /** - * Plugin LoaderOptionsPlugin (experimental) - * - * See: https://gist.github.com/sokra/27b24881210b56bbaff7 - */ - new LoaderOptionsPlugin({ - debug: true, - options: { - /** - * Static analysis linter for TypeScript advanced options configuration - * Description: An extensible linter for the TypeScript language. - * - * See: https://github.com/wbuchwalter/tslint-loader - */ - tslint: { - emitErrors: false, - failOnHint: false, - resourcePath: 'src' - }, - } - }), - ], - // we need this due to problems with es6-shim - node: { - global: true, - progress: false, - crypto: 'empty', - module: false, - clearImmediate: false, - setImmediate: false - } + plugins: plugins, + }; }; - -/** - * Target Electron - */ -config.target = 'electron-renderer'; -module.exports = config; diff --git a/package.json b/package.json index 114eabbe6..22f897224 100644 --- a/package.json +++ b/package.json @@ -192,6 +192,7 @@ "reflect-metadata": "^0.1.8", "rxjs": "~5.2.0", "systemjs": "0.19.41", + "webpack-target-electron-renderer": "^0.4.0", "zone.js": "^0.8.4" } } From 238ac68a2ef91b131a8df03ab7f880b3d9197f17 Mon Sep 17 00:00:00 2001 From: ianm Date: Fri, 31 Mar 2017 15:38:49 -0400 Subject: [PATCH 16/17] build tasks and webpack config needs index build or its own?? --- electron/package.json | 153 ++++------- electron/src/assets/data.json | 6 + electron/src/assets/favicon/favicon-DEV.ico | Bin 0 -> 1150 bytes electron/src/assets/favicon/favicon-PROD.ico | Bin 0 -> 1118 bytes electron/src/assets/i18n/bg.json | 11 + electron/src/assets/i18n/en.json | 11 + electron/src/assets/i18n/es.json | 11 + electron/src/assets/i18n/fr.json | 11 + electron/src/assets/i18n/ru.json | 11 + electron/src/assets/logo.icns | Bin 0 -> 121052 bytes electron/src/assets/logo.ico | Bin 0 -> 370070 bytes electron/src/assets/svg/more.svg | 7 + electron/src/assets/svg/smile.svg | 170 ++++++++++++ electron/src/main.desktop.ts | 270 +++++++++++++++++++ electron/src/package.json | 5 + electron/src/polyfills.ts | 13 + electron/src/tsconfig.json | 39 +++ electron/src/vendor.ts | 2 + electron/tsconfig.aot.json | 35 +++ electron/tsconfig.json | 3 + electron/typedoc.json | 15 -- electron/webpack.config.js | 7 +- package.json | 3 +- tools/config/seed.tasks.json | 6 + tools/tasks/seed/build.elec.config.ts | 71 ----- tools/tasks/seed/build.elec_html_css.ts | 91 +++++++ tools/tasks/seed/build.js.elec.ts | 75 ++++++ 27 files changed, 840 insertions(+), 186 deletions(-) create mode 100644 electron/src/assets/data.json create mode 100644 electron/src/assets/favicon/favicon-DEV.ico create mode 100644 electron/src/assets/favicon/favicon-PROD.ico create mode 100644 electron/src/assets/i18n/bg.json create mode 100644 electron/src/assets/i18n/en.json create mode 100644 electron/src/assets/i18n/es.json create mode 100644 electron/src/assets/i18n/fr.json create mode 100644 electron/src/assets/i18n/ru.json create mode 100644 electron/src/assets/logo.icns create mode 100644 electron/src/assets/logo.ico create mode 100644 electron/src/assets/svg/more.svg create mode 100644 electron/src/assets/svg/smile.svg create mode 100644 electron/src/main.desktop.ts create mode 100644 electron/src/package.json create mode 100644 electron/src/tsconfig.json create mode 100644 electron/tsconfig.aot.json delete mode 100644 electron/typedoc.json delete mode 100644 tools/tasks/seed/build.elec.config.ts create mode 100644 tools/tasks/seed/build.elec_html_css.ts create mode 100644 tools/tasks/seed/build.js.elec.ts diff --git a/electron/package.json b/electron/package.json index b3e4e9b59..078a2a7b8 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,108 +1,73 @@ { - "name": "angular2-electron", + "name": "angular-seed-advanced", + "main": "app.js", "version": "0.0.0", - "description": "Angular 2 with Electron and Webpack", - "main": "", - "scripts": { - "watch": "npm run watch:dev", - "watch:dev": "webpack --watch --progress --profile", - "build": "npm run build:dev", - "build:dev": "webpack --progress --profile", - "package": "node package.js", - "package-all": "npm run package -- --all", - "electron": "electron src/app", - "webpack-test": "webpack --config webpack.test.js --progress --profile", - "test": "karma start" - }, - "repository": { - "type": "git", - "url": "https://github.com/joaogarin/angular2-electron.git" + "nativescript": { + "id": "com.yourdomain.nativescript", + "tns-ios": { + "version": "2.5.0" + }, + "tns-android": { + "version": "2.5.0" + } }, - "author": "joaogarin ", - "license": "MIT", - "bugs": { - "url": "https://github.com/joaogarin/angular2-electron/issues" + "scripts": { + "preinstall": "mkdirp app", + "clean": "rimraf platforms node_modules lib hooks app && mkdirp app", + "ns-bundle": "ns-bundle", + "start-android-bundle": "npm run ns-bundle --android --start-app", + "start-ios-bundle": "npm run ns-bundle --ios --start-app", + "build-android-bundle": "npm run ns-bundle --android --build-app", + "build-ios-bundle": "npm run ns-bundle --ios --build-app" }, - "homepage": "", "dependencies": { - "@angular/common": "^4.0.0", - "@angular/compiler": "^4.0.0", - "@angular/core": "^4.0.0", - "@angular/forms": "^4.0.0", - "@angular/http": "^4.0.0", - "@angular/platform-browser": "^4.0.0", - "@angular/platform-browser-dynamic": "^4.0.0", - "@angular/platform-server": "^4.0.0", - "@angular/router": "^4.0.0", + "@angular/animations": "~4.0.0", + "@angular/common": "~4.0.0", + "@angular/compiler": "~4.0.0", + "@angular/core": "~4.0.0", + "@angular/forms": "~4.0.0", + "@angular/http": "~4.0.0", + "@angular/platform-browser": "~4.0.0", + "@angular/platform-browser-dynamic": "~4.0.0", + "@angular/router": "~4.0.0", "@ngrx/core": "^1.2.0", "@ngrx/effects": "^2.0.0", "@ngrx/store": "^2.2.1", - "@ngx-translate/core": "^6.0.0", + "@ngx-translate/core": "^6.0.1", "@ngx-translate/http-loader": "0.0.3", "angulartics2": "^1.6.4", - "copy-webpack-plugin": "^4.0.1", - "core-js": "^2.4.1", - "es-module-loader": "^1.0.0", - "intl": "^1.2.5", "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "electron": "^1.4.3", - "rxjs": "^5.2.0", - "webpack-target-electron-renderer": "^0.4.0", - "zone.js": "^0.8.5" + "nativescript-angular": "1.5.0", + "nativescript-dev-webpack": "^0.3.1", + "nativescript-theme-core": "^1.0.3", + "ngrx-store-freeze": "0.1.9", + "reflect-metadata": "^0.1.8", + "rxjs": "~5.2.0", + "tns-core-modules": "^2.5.2", + "url": "0.10.3", + "zone.js": "~0.8.2" }, "devDependencies": { - "@types/hammerjs": "^2.0.33", - "@types/jasmine": "^2.2.34", - "@types/moment-timezone": "^0.2.32", - "@types/node": "^7.0.1", - "@types/source-map": "^0.5.0", - "@types/uglify-js": "^2.0.27", - "@types/webpack": "^2.0.0", - "angular2-template-loader": "^0.6.0", - "awesome-typescript-loader": "^3.0.0-beta.18", - "codelyzer": "^2.0.0-beta.2", - "css-loader": "^0.28.0", - "electron-packager": "^8.1.0", - "es6-promise-loader": "^1.0.1", - "extract-text-webpack-plugin": "^2.0.0", - "file-loader": "^0.10.0", - "imports-loader": "^0.7.0", - "istanbul-instrumenter-loader": "^2.0.0", - "jasmine-core": "^2.4.1", - "json-loader": "^0.5.4", - "karma": "^1.3.0", - "karma-chrome-launcher": "^2.0.0", - "karma-coverage": "^1.0.0", - "karma-jasmine": "^1.0.2", - "karma-mocha-reporter": "^2.0.0", - "karma-remap-coverage": "^0.1.4", - "karma-phantomjs-launcher": "^1.0.0", - "karma-sourcemap-loader": "^0.3.7", - "karma-webpack": "2.0.2", - "node-sass": "^4.0.0", - "phantomjs-polyfill": "0.0.2", - "phantomjs-prebuilt": "^2.1.7", - "raw-loader": "0.5.1", - "reflect-metadata": "0.1.10", - "remap-istanbul": "^0.9.0", - "rimraf": "^2.5.2", - "sass-loader": "^6.0.1", - "source-map-loader": "^0.1.5", - "style-loader": "^0.16.1", - "svg-url-loader": "^2.0.0", - "ts-helpers": "^1.1.1", - "tsconfig-lint": "^0.12.0", - "tslint": "^5.0.0", - "tslint-loader": "^3.2.0", - "typescript": "~2.1.5", - "url-loader": "^0.5.7", - "webpack": "2.3.1", - "webpack-dev-middleware": "^1.10.0", - "webpack-dev-server": "2.4.1" - }, - "engines": { - "node": ">= 4.2.1 <= 6", - "npm": ">= 3" + "@angular/compiler-cli": "~4.0.0", + "@ngrx/store-devtools": "^3.2.4", + "@ngtools/webpack": "~1.3.0", + "@types/lodash": "4.14.59", + "@types/jasmine": "^2.5.47", + "babel-traverse": "6.20.0", + "babel-types": "6.20.0", + "babylon": "6.14.1", + "copy-webpack-plugin": "~4.0.1", + "extract-text-webpack-plugin": "~2.1.0", + "fs-extra": "^2.1.2", + "htmlparser2": "^3.9.2", + "lazy": "1.0.11", + "nativescript-css-loader": "~0.26.1", + "nativescript-dev-android-snapshot": "^0.*.*", + "nativescript-dev-webpack": "^0.3.6", + "raw-loader": "~0.5.1", + "resolve-url-loader": "~2.0.2", + "typescript": "~2.1.4", + "webpack": "2.3.2", + "webpack-sources": "~0.2.3" } -} +} \ No newline at end of file diff --git a/electron/src/assets/data.json b/electron/src/assets/data.json new file mode 100644 index 000000000..d371e9ce9 --- /dev/null +++ b/electron/src/assets/data.json @@ -0,0 +1,6 @@ +[ + "Edsger Dijkstra", + "Donald Knuth", + "Alan Turing", + "Grace Hopper" +] diff --git a/electron/src/assets/favicon/favicon-DEV.ico b/electron/src/assets/favicon/favicon-DEV.ico new file mode 100644 index 0000000000000000000000000000000000000000..2b6c8f0a9ad7bec10cb914d84cb941d36fa5f0b7 GIT binary patch literal 1150 zcmchVzb^z)5XVO%3gl+o1rf!GiqhXfsg;PhbGi4FYAUV2LZR^^;tHA#Zr^rSYE(o- zq7YGNWX*e*NhTY6Ps47$`<seJzg(Lhz1gZRGPmO_z504;=~(JTFY>yc zw5XmLd z&W7h3eAJx8F+Mfe2)xA$VYCn8yUofx*I#^3YH?L_5^H{sS3YS^j$IpE;{U(TdJA=f z9qBK+@MX?3&aavil_Dqin)Cb5`|{4ZJnW&)v literal 0 HcmV?d00001 diff --git a/electron/src/assets/i18n/bg.json b/electron/src/assets/i18n/bg.json new file mode 100644 index 000000000..60d246079 --- /dev/null +++ b/electron/src/assets/i18n/bg.json @@ -0,0 +1,11 @@ +{ + "HOME": "у дома", + "ABOUT": "около", + "HELLO": "Здравей", + "LOVE_TECH": "Обичам технологиите!", + "ABOUT_ADD": "Искаш повече? Добавете ги себе си!", + "ABOUT_REWARD": "За награда, тук е списък на страхотни компютърни специалисти:", + "INPUT_HINT": "Въвеждане на нов компютърен специалист...", + "ADD_BTN_TEXT": "Добави", + "SUCCESS_MSG": "Вашият разполагане на ъгловото Seed Advanced работи перфектно." +} diff --git a/electron/src/assets/i18n/en.json b/electron/src/assets/i18n/en.json new file mode 100644 index 000000000..97814db05 --- /dev/null +++ b/electron/src/assets/i18n/en.json @@ -0,0 +1,11 @@ +{ + "HOME": "Home", + "ABOUT": "About", + "HELLO": "Hello", + "LOVE_TECH": "I love technology!", + "ABOUT_ADD": "You want more? Add them yourself!", + "ABOUT_REWARD": "For reward, here is a list of awesome computer scientists:", + "INPUT_HINT": "Enter a new computer scientist...", + "ADD_BTN_TEXT": "Add", + "SUCCESS_MSG": "Your deployment of Angular Seed Advanced worked perfectly." +} diff --git a/electron/src/assets/i18n/es.json b/electron/src/assets/i18n/es.json new file mode 100644 index 000000000..37e890520 --- /dev/null +++ b/electron/src/assets/i18n/es.json @@ -0,0 +1,11 @@ +{ + "HOME": "Casa", + "ABOUT": "Acerca de", + "HELLO": "Hola", + "LOVE_TECH": "Me encanta la tecnología!", + "ABOUT_ADD": "¿Quieres más? Añadir a ti mismo!", + "ABOUT_REWARD": "Para recompensa, aquí hay una lista de científicos informáticos impresionantes:", + "INPUT_HINT": "Introduzca un nuevo científico de la computación...", + "ADD_BTN_TEXT": "Añadir", + "SUCCESS_MSG": "Su despliegue de Angular avanzada Semilla funcionó a la perfección." +} diff --git a/electron/src/assets/i18n/fr.json b/electron/src/assets/i18n/fr.json new file mode 100644 index 000000000..8d72aa98e --- /dev/null +++ b/electron/src/assets/i18n/fr.json @@ -0,0 +1,11 @@ +{ + "HOME": "Accueil", + "ABOUT": "À propos", + "HELLO": "Bonjour", + "LOVE_TECH": "J'adore la technologie !", + "ABOUT_ADD": "Vous en voulez plus? Ajoutez-les vous-même !", + "ABOUT_REWARD": "En récompense, voici une liste de géniaux informaticiens :", + "INPUT_HINT": "Ajouter un nouvel informaticien...", + "ADD_BTN_TEXT": "Ajouter", + "SUCCESS_MSG": "Votre déploiement d'Angular Seed Advanced a parfaitement fonctionné." +} diff --git a/electron/src/assets/i18n/ru.json b/electron/src/assets/i18n/ru.json new file mode 100644 index 000000000..433ec6b3c --- /dev/null +++ b/electron/src/assets/i18n/ru.json @@ -0,0 +1,11 @@ +{ + "HOME": "Главная", + "ABOUT": "Справка", + "HELLO": "Здравствуйте", + "LOVE_TECH": "Я люблю технологию!", + "ABOUT_ADD": "Хочешь больше? Добавь их самостоятельно!", + "ABOUT_REWARD": "В награду, вот список классных компьютерных ученых:", + "INPUT_HINT": "Введите нового ученого...", + "ADD_BTN_TEXT": "Добавить", + "SUCCESS_MSG": "Ваш Angular Seed Advanced развернут отлично." +} diff --git a/electron/src/assets/logo.icns b/electron/src/assets/logo.icns new file mode 100644 index 0000000000000000000000000000000000000000..983a10d3e32d6a50f5e69c9ff07b77eca867c347 GIT binary patch literal 121052 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 Kx9U6k?tcMa$$aeq literal 0 HcmV?d00001 diff --git a/electron/src/assets/svg/more.svg b/electron/src/assets/svg/more.svg new file mode 100644 index 000000000..1b6b1dd01 --- /dev/null +++ b/electron/src/assets/svg/more.svg @@ -0,0 +1,7 @@ + + + diff --git a/electron/src/assets/svg/smile.svg b/electron/src/assets/svg/smile.svg new file mode 100644 index 000000000..368c12e4c --- /dev/null +++ b/electron/src/assets/svg/smile.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + emoticon + emote + smiley + happy + :) + :-) + + + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/electron/src/main.desktop.ts b/electron/src/main.desktop.ts new file mode 100644 index 000000000..9a16ad174 --- /dev/null +++ b/electron/src/main.desktop.ts @@ -0,0 +1,270 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'production'; +console.log(`Electron launching with NODE_ENV: ${process.env.NODE_ENV}`); + +// electron +const electron = require('electron'); +const app = electron.app; +const Menu: any = electron.Menu; +const shell: any = electron.shell; +// const {crashReporter} = require('electron'); +const BrowserWindow = electron.BrowserWindow; +let mainWindow: any = null; +let template: any; +let menu: any; + +// app +import { DesktopConfig } from './app/shared/electron/index'; + +// Sample +// You would need a valid `submitURL` to use +// crashReporter.start({ +// productName: 'AngularSeedAdvanced', +// companyName: 'NathanWalker', +// submitURL: 'https://github.com/NathanWalker/angular-seed-advanced', +// autoSubmit: true +// }); + +if (process.env.NODE_ENV === 'development') { + require('electron-debug')(); +} + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('ready', () => { + + // Initialize the window to our specified dimensions + mainWindow = new BrowserWindow({ width: 900, height: 620 }); + + // Tell Electron where to load the entry point from + mainWindow.loadURL('file://' + __dirname + '/index.html'); + + // Clear out the main window when the app is closed + mainWindow.on('closed', () => { + mainWindow = null; + }); + + mainWindow.webContents.on('did-navigate-in-page', (e: any, url: string) => { + console.log(`Page navigated: ${url}`); + }); + + let appTitle: string = `Angular Seed Advanced`; + + let langMenu: any = { + label: 'Language', + submenu: [] + }; + for (var lang of DesktopConfig.SUPPORTED_LANGUAGES) { + let code = lang.code; + let langOption = { + label: lang.title, + click:() => { + console.log(`Change lang: ${code}`); + mainWindow.webContents.executeJavaScript(`window.dispatchEvent(new CustomEvent('changeLang', {detail: { value: '${code}'} }));`); + } + }; + langMenu.submenu.push(langOption); + } + + let helpMenu: any = { + label: 'Help', + submenu: [{ + label: 'Learn More', + click:() => { + shell.openExternal('https://github.com/NathanWalker/angular-seed-advanced'); + } + }, { + label: 'Issues', + click:() => { + shell.openExternal('https://github.com/NathanWalker/angular-seed-advanced/issues'); + } + }, { + label: `My Amazing Parent: Minko Gechev's Angular Seed`, + click:() => { + shell.openExternal('https://github.com/mgechev/angular-seed'); + } + }, { + label: 'Angular 2', + click:() => { + shell.openExternal('https://angular.io/'); + } + }, { + label: 'Electron', + click:() => { + shell.openExternal('http://electron.atom.io/'); + } + }, { + label: 'Electron Docs', + click: () => { + shell.openExternal('https://github.com/atom/electron/tree/master/docs'); + } + }, { + label: 'Codeology Visualization', + click:() => { + shell.openExternal('http://codeology.braintreepayments.com/nathanwalker/angular-seed-advanced'); + } + }] + }; + + if (process.platform === 'darwin') { + template = [{ + label: appTitle, + submenu: [{ + label: `About ${appTitle}`, + selector: 'orderFrontStandardAboutPanel:' + }, { + type: 'separator' + }, { + label: 'Services', + submenu: [] + }, { + type: 'separator' + }, { + label: 'Hide Angular Seed Advanced', + accelerator: 'Command+H', + selector: 'hide:' + }, { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:' + }, { + label: 'Show All', + selector: 'unhideAllApplications:' + }, { + type: 'separator' + }, { + label: 'Quit', + accelerator: 'Command+Q', + click:() => { + app.quit(); + } + }] + }, { + label: 'Edit', + submenu: [{ + label: 'Undo', + accelerator: 'Command+Z', + selector: 'undo:' + }, { + label: 'Redo', + accelerator: 'Shift+Command+Z', + selector: 'redo:' + }, { + type: 'separator' + }, { + label: 'Cut', + accelerator: 'Command+X', + selector: 'cut:' + }, { + label: 'Copy', + accelerator: 'Command+C', + selector: 'copy:' + }, { + label: 'Paste', + accelerator: 'Command+V', + selector: 'paste:' + }, { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:' + }] + }, { + label: 'View', + submenu: (process.env.NODE_ENV === 'development') ? [{ + label: 'Reload', + accelerator: 'Command+R', + click:() => { + mainWindow.reload(); + } + }, { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }, { + label: 'Toggle Developer Tools', + accelerator: 'Alt+Command+I', + click:() => { + mainWindow.toggleDevTools(); + } + }] : [{ + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }] + }, { + label: 'Window', + submenu: [{ + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:' + }, { + label: 'Close', + accelerator: 'Command+W', + selector: 'performClose:' + }, { + type: 'separator' + }, { + label: 'Bring All to Front', + selector: 'arrangeInFront:' + }] + }, + langMenu, + helpMenu]; + + menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + } else { + template = [{ + label: '&File', + submenu: [{ + label: '&Open', + accelerator: 'Ctrl+O' + }, { + label: '&Close', + accelerator: 'Ctrl+W', + click:() => { + mainWindow.close(); + } + }] + }, { + label: '&View', + submenu: (process.env.NODE_ENV === 'development') ? [{ + label: '&Reload', + accelerator: 'Ctrl+R', + click:() => { + mainWindow.reload(); + } + }, { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }, { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click:() => { + mainWindow.toggleDevTools(); + } + }] : [{ + label: 'Toggle &Full Screen', + accelerator: 'F11', + click:() => { + mainWindow.setFullScreen(!mainWindow.isFullScreen()); + } + }] + }, + langMenu, + helpMenu]; + menu = Menu.buildFromTemplate(template); + mainWindow.setMenu(menu); + } + +}); diff --git a/electron/src/package.json b/electron/src/package.json new file mode 100644 index 000000000..102631975 --- /dev/null +++ b/electron/src/package.json @@ -0,0 +1,5 @@ +{ + "name": "angular-seed-advanced", + "version": "1.0.0", + "main": "main.desktop.js" +} diff --git a/electron/src/polyfills.ts b/electron/src/polyfills.ts index e69de29bb..27f20b00d 100644 --- a/electron/src/polyfills.ts +++ b/electron/src/polyfills.ts @@ -0,0 +1,13 @@ +import 'core-js/es6'; +import 'core-js/es7/reflect'; +require('zone.js/dist/zone.js'); +//Error['stackTraceLimit'] = Infinity; + +require('zone.js/dist/long-stack-trace-zone'); + +// RxJS +// to include every operator uncomment +// require('rxjs/Rx'); + +require('rxjs/add/operator/map'); +require('rxjs/add/operator/mergeMap'); \ No newline at end of file diff --git a/electron/src/tsconfig.json b/electron/src/tsconfig.json new file mode 100644 index 000000000..58aaff659 --- /dev/null +++ b/electron/src/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "declaration": false, + "removeComments": true, + "noLib": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": [ + "es6", + "dom", + "es2015.iterable" + ], + "sourceMap": true, + "pretty": true, + "noEmitHelpers": true, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "noImplicitAny": false, + "noImplicitReturns": true, + "noImplicitUseStrict": false, + "noFallthroughCasesInSwitch": true, + "typeRoots": [ + "../node_modules/@types", + "../node_modules" + ], + "types": [ + "jasmine", + "node" + ] + }, + "exclude": [ + "node_modules", + "platforms", + "*.aot.ts" + ], + "compileOnSave": false +} diff --git a/electron/src/vendor.ts b/electron/src/vendor.ts index 1249bbf98..f085d3f93 100644 --- a/electron/src/vendor.ts +++ b/electron/src/vendor.ts @@ -1,3 +1,5 @@ +require('./vendor-platform'); + require('reflect-metadata'); require('@angular/platform-browser'); require('@angular/core'); diff --git a/electron/tsconfig.aot.json b/electron/tsconfig.aot.json new file mode 100644 index 000000000..b1221e9af --- /dev/null +++ b/electron/tsconfig.aot.json @@ -0,0 +1,35 @@ +{ + "extend": "./tsconfig", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "ui/*": ["node_modules/tns-core-modules/ui/*"], + "platform": ["node_modules/tns-core-modules/platform"], + "image-source": ["node_modules/tns-core-modules/image-source"], + "xml": ["node_modules/tns-core-modules/xml"], + "xhr": ["node_modules/tns-core-modules/xhr"], + "text": ["node_modules/tns-core-modules/text"], + "data": ["node_modules/tns-core-modules/data"], + "fetch": ["node_modules/tns-core-modules/fetch"], + "trace": ["node_modules/tns-core-modules/trace"], + "fps-meter": ["node_modules/tns-core-modules/fps-meter"], + "color": ["node_modules/tns-core-modules/color"], + "application-settings": ["node_modules/tns-core-modules/application-settings"], + "http": ["node_modules/tns-core-modules/http"], + "camera": ["node_modules/tns-core-modules/camera"], + "console": ["node_modules/tns-core-modules/console"], + "timer": ["node_modules/tns-core-modules/timer"], + "utils": ["node_modules/tns-core-modules/utils"], + "location": ["node_modules/tns-core-modules/location"], + "file-system": ["node_modules/tns-core-modules/file-system"], + "application": ["node_modules/tns-core-modules/application"], + "image-asset": ["node_modules/tns-core-modules/image-asset"], + "connectivity": ["node_modules/tns-core-modules/connectivity"], + "globals": ["node_modules/tns-core-modules/globals"] + } + }, + "angularCompilerOptions": { + "skipMetadataEmit": true, + "genDir": "./" + } +} diff --git a/electron/tsconfig.json b/electron/tsconfig.json index f5bd60a6f..7be367f89 100644 --- a/electron/tsconfig.json +++ b/electron/tsconfig.json @@ -14,6 +14,9 @@ "dom", "es6" ], + "types": [ + "node" + ], "typeRoots": [ "node_modules/@types" ] diff --git a/electron/typedoc.json b/electron/typedoc.json deleted file mode 100644 index 1a9f28275..000000000 --- a/electron/typedoc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "mode": "modules", - "out": "doc", - "theme": "default", - "ignoreCompilerErrors": "true", - "experimentalDecorators": "true", - "emitDecoratorMetadata": "true", - "target": "ES5", - "moduleResolution": "node", - "preserveConstEnums": "true", - "stripInternal": "true", - "suppressExcessPropertyErrors": "true", - "suppressImplicitAnyIndexErrors": "true", - "module": "commonjs" -} \ No newline at end of file diff --git a/electron/webpack.config.js b/electron/webpack.config.js index 8cc0d4428..d0dd7d48c 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -23,9 +23,9 @@ module.exports = function(platform, destinationApp) { var entry = {}; //Discover entry module from package.json - entry.bundle = './app.ts' + entry.bundle = './app' //Vendor entry with third party libraries. - entry.vendor = './vendor.ts'; + entry.vendor = './vendor'; //app.css bundle entry['app.css'] = './app.css'; @@ -43,9 +43,6 @@ module.exports = function(platform, destinationApp) { // }), //Copy assets to out dir. Add your own globs as needed. new CopyWebpackPlugin([{ - from: 'app.css', - to: 'app.css' - }, { from: 'css/**' }, { from: 'fonts/**' diff --git a/package.json b/package.json index 22f897224..8b6913dd4 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "karma": "karma", "karma.start": "karma start", "nativescript-install": "cd nativescript && npm install", + "electron-install": "cd electron && npm install", "postinstall": "gulp check.versions && gulp build.bundle.rxjs && npm prune && gulp webdriver && npm run nativescript-install && node tools/install.js", "reinstall": "npm cache clean && npm install", "serve.coverage": "gulp serve.coverage --color", @@ -43,7 +44,7 @@ "serve.prod.rollup.aot": "gulp serve.prod.rollup.aot --color --env-config prod --build-type prod", "start": "gulp serve.dev --color", "start.deving": "gulp start.deving --color", - "start.desktop": "gulp desktop && NODE_ENV=development electron ./dist/dev", + "start.desktop": "npm run gulp build.elec && cd electron && electron ./app/app", "start.livesync.desktop": "gulp desktop && NODE_ENV=development gulp desktop.watch", "start.livesync.desktop.windows": "gulp desktop && SET NODE_ENV=development && gulp desktop.watch", "start.desktop.windows": "gulp desktop && SET NODE_ENV=development && electron ./dist/dev", diff --git a/tools/config/seed.tasks.json b/tools/config/seed.tasks.json index 48f18c981..46695c915 100644 --- a/tools/config/seed.tasks.json +++ b/tools/config/seed.tasks.json @@ -82,6 +82,12 @@ "build.js.tns" ], + "build.elec": [ + "build.assets.elec", + "build.elec_html_css", + "build.js.elec" + ], + "build.prod.tns": [ "clean.tns", "tslint.tns", diff --git a/tools/tasks/seed/build.elec.config.ts b/tools/tasks/seed/build.elec.config.ts deleted file mode 100644 index e5de2991f..000000000 --- a/tools/tasks/seed/build.elec.config.ts +++ /dev/null @@ -1,71 +0,0 @@ -import * as gulp from 'gulp'; -import * as gulpLoadPlugins from 'gulp-load-plugins'; -import * as merge from 'merge-stream'; -import * as util from 'gulp-util'; -import { join/*, sep, relative*/ } from 'path'; - -import Config from '../../config'; -import { makeTsProject, TemplateLocalsBuilder } from '../../utils'; -import { TypeScriptTask } from '../typescript_task'; - -const plugins = gulpLoadPlugins(); - -let typedBuildCounter = Config.TYPED_COMPILE_INTERVAL; // Always start with the typed build. - -/** - * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development - * environment. - */ -export = - class BuildElectronConfig extends TypeScriptTask { - run() { - let tsProject: any; - let typings = gulp.src([ - Config.TOOLS_DIR + '/manual_typings/**/*.d.ts' - ]); - let src = [ - join(Config.ELECTRON_BASE_DIR, 'webpack', '**/*.ts'), - ]; - - let projectFiles = gulp.src(src); - let result: any; - let isFullCompile = true; - - // Only do a typed build every X builds, otherwise do a typeless build to speed things up - if (typedBuildCounter < Config.TYPED_COMPILE_INTERVAL) { - isFullCompile = false; - tsProject = makeTsProject({ isolatedModules: true }); - projectFiles = projectFiles.pipe(plugins.cached()); - util.log('Performing typeless TypeScript compile.'); - } else { - tsProject = makeTsProject(); - projectFiles = merge(typings, projectFiles); - } - - result = projectFiles - .pipe(plugins.plumber()) - //.pipe(plugins.sourcemaps.init()) - .pipe(tsProject()) - .on('error', () => { - typedBuildCounter = Config.TYPED_COMPILE_INTERVAL; - }); - - if (isFullCompile) { - typedBuildCounter = 0; - } else { - typedBuildCounter++; - } - - return result.js - .pipe(plugins.sourcemaps.write()) - // Use for debugging with Webstorm/IntelliJ - // https://github.com/mgechev/angular-seed/issues/1220 - // .pipe(plugins.sourcemaps.write('.', { - // includeContent: false, - // sourceRoot: (file: any) => - // relative(file.path, Config.PROJECT_ROOT + '/' + Config.APP_SRC).replace(sep, '/') + '/' + Config.APP_SRC - // })) - .pipe(plugins.template(new TemplateLocalsBuilder().withStringifiedSystemConfigDev().build())) - .pipe(gulp.dest(join(Config.ELECTRON_BASE_DIR,'config'))); - } - }; diff --git a/tools/tasks/seed/build.elec_html_css.ts b/tools/tasks/seed/build.elec_html_css.ts new file mode 100644 index 000000000..83ee4ba98 --- /dev/null +++ b/tools/tasks/seed/build.elec_html_css.ts @@ -0,0 +1,91 @@ +import * as gulp from 'gulp'; +import * as gulpLoadPlugins from 'gulp-load-plugins'; +import * as merge from 'merge-stream'; +import * as util from 'gulp-util'; +import * as rename from 'gulp-rename'; + +import Config from '../../config'; +import { CssTask } from '../css_task'; + +const plugins = gulpLoadPlugins(); +const reportPostCssError = (e: any) => util.log(util.colors.red(e.message)); + +function renamer() { + return rename((path: any) => { + path.basename = path.basename.replace(/\.elec/, ''); + }); +} + +function prepareTemplates() { + return gulp.src([ + '**/*.html', + 'app/**/*.html', + '!app/**/*.component.html', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(renamer()) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); +} + +function processComponentStylesheets() { + return Config.ENABLE_SCSS ? + merge( + processComponentScss(), + processComponentCss()) + : + processComponentCss(); +} + +function processComponentCss() { + return gulp.src([ + '**/*.css', + 'app/**/*.css', + '!app/**/*.component.css', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(renamer()) + //.on('error', reportPostCssError) // Causes Property 'pipe' does not exist on type 'EventEmitter'. + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); +} + +/** + * Process scss files referenced from Angular component `styleUrls` metadata + */ +function processComponentScss() { + const stream = gulp.src([ + '**/*.scss', + 'app/**/*.scss', + '!app/**/*.component.scss', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(plugins.sourcemaps.init()) + .pipe(plugins.sass(Config.getPluginConfig('gulp-sass-tns')).on('error', plugins.sass.logError)) + .pipe(plugins.sourcemaps.write()); + + return stream + .pipe(renamer()) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); +} + +export = + class BuildElectronCSS extends CssTask { + shallRun(files: String[]) { + // Only run if tns-resources + return files.some((f) => + // tns.html, tns.scss or tns.css under nativescript/src/app + (f.indexOf('electron/src/app') !== -1 && !!f.match(/\.elec\.(s?css|html)$/)) || + // .html, .scss or .css NOT under nativescript/src/app + (f.indexOf('electron/src/app') === -1 && !!f.match(/\.(s?css|html)$/)) + ); + } + + run() { + return merge(processComponentStylesheets(), prepareTemplates()); + } + }; diff --git a/tools/tasks/seed/build.js.elec.ts b/tools/tasks/seed/build.js.elec.ts new file mode 100644 index 000000000..6d5123d1e --- /dev/null +++ b/tools/tasks/seed/build.js.elec.ts @@ -0,0 +1,75 @@ +import * as gulp from 'gulp'; +import * as gulpLoadPlugins from 'gulp-load-plugins'; +import * as merge from 'merge-stream'; +import * as fs from 'fs'; +import * as path from 'path'; + +import Config from '../../config'; +import { makeTsProject, TemplateLocalsBuilder } from '../../utils'; +import { TypeScriptTask } from '../typescript_task'; + +const plugins = gulpLoadPlugins(); + +const jsonSystemConfig = JSON.stringify(Config.ELECTRON_CONFIG); + +/** + * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development + * environment. + */ +export = + class BuildJsDev extends TypeScriptTask { + run() { + const src = [ + '**/*.ts', + 'app/**/*.ts', + '!**/*.spec.ts', + '!app/**/*.spec.ts', + '!**/*.e2e-spec.ts', + '!app/**/*.e2e-spec.ts', + '!app/shared/test/**/*', + `!**/${Config.NG_FACTORY_FILE}.ts`, + ]; + + const tsProject = makeTsProject({}, Config.ELECTRON_APP_SRC); + + const result = gulp.src([ + ...src, + '!**/*.aot.ts', + ], { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(plugins.sourcemaps.init()) + .pipe(tsProject()); + + const template = (Object).assign( + new TemplateLocalsBuilder().withStringifiedSystemConfigDev().build(), { + SYSTEM_CONFIG_TNS: jsonSystemConfig + }, + ); + + const transpiled = result.js + .pipe(plugins.sourcemaps.write()) + // Use for debugging with Webstorm/IntelliJ + // https://github.com/mgechev/angular-seed/issues/1220 + // .pipe(plugins.sourcemaps.write('.', { + // includeContent: false, + // sourceRoot: (file: any) => + // relative(file.path, PROJECT_ROOT + '/' + APP_SRC).replace(sep, '/') + '/' + APP_SRC + // })) + .pipe(plugins.template(template)) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); + + const copy = gulp.src(src, { + base: Config.ELECTRON_APP_SRC, + cwd: Config.ELECTRON_APP_SRC, + }) + .pipe(gulp.dest(Config.ELECTRON_APP_DEST)); + + fs.writeFileSync(path.join(Config.ELECTRON_APP_DEST, 'build-config.json'), JSON.stringify(template)); + + return merge(transpiled, copy); + } + }; + + From ddbd6e421c9e98e94801f1598c3188cefe4d5f4e Mon Sep 17 00:00:00 2001 From: ianm Date: Fri, 31 Mar 2017 16:00:02 -0400 Subject: [PATCH 17/17] fix style urls --- src/client/app/shared/sample/components/navbar.component.ts | 2 +- src/client/app/shared/sample/components/toolbar.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/app/shared/sample/components/navbar.component.ts b/src/client/app/shared/sample/components/navbar.component.ts index 99ea54565..bee4e5c8d 100644 --- a/src/client/app/shared/sample/components/navbar.component.ts +++ b/src/client/app/shared/sample/components/navbar.component.ts @@ -6,7 +6,7 @@ import { Component } from '@angular/core'; selector: 'sd-navbar', templateUrl: 'navbar.component.html', styleUrls: [ - 'navbar.component.scss', + 'navbar.component.css', ], }) export class NavbarComponent { diff --git a/src/client/app/shared/sample/components/toolbar.component.ts b/src/client/app/shared/sample/components/toolbar.component.ts index af4be871e..45b2391de 100644 --- a/src/client/app/shared/sample/components/toolbar.component.ts +++ b/src/client/app/shared/sample/components/toolbar.component.ts @@ -8,7 +8,7 @@ import { LogService } from '../../core/index'; selector: 'sd-toolbar', templateUrl: 'toolbar.component.html', styleUrls: [ - 'toolbar.component.scss', + 'toolbar.component.css', ], }) export class ToolbarComponent {