diff --git a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts index d6fa06f853..bd2debf0cb 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts @@ -25,6 +25,11 @@ const routes: Routes = [ loadChildren: () => import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), }, + { + path: 'setting-management', + loadChildren: () => + import('./lazy-libs/setting-management-wrapper.module').then(m => m.SettingManagementWrapperModule), + }, ]; @NgModule({ diff --git a/npm/ng-packs/apps/dev-app/src/app/app.module.ts b/npm/ng-packs/apps/dev-app/src/app/app.module.ts index 14c9a7bb4f..17f75b6471 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.module.ts @@ -14,6 +14,7 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { AccountConfigModule } from '@abp/ng.account.config'; import { IdentityConfigModule } from '@abp/ng.identity.config'; import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management.config'; @NgModule({ declarations: [AppComponent], @@ -28,6 +29,7 @@ import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; AccountConfigModule.forRoot({ redirectUrl: '/' }), IdentityConfigModule, TenantManagementConfigModule, + SettingManagementConfigModule, BrowserModule, BrowserAnimationsModule, AppRoutingModule, diff --git a/npm/ng-packs/apps/dev-app/src/app/lazy-libs/setting-management-wrapper.module.ts b/npm/ng-packs/apps/dev-app/src/app/lazy-libs/setting-management-wrapper.module.ts new file mode 100644 index 0000000000..e5f3db8878 --- /dev/null +++ b/npm/ng-packs/apps/dev-app/src/app/lazy-libs/setting-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { SettingManagementModule } from '@abp/ng.setting-management'; + +@NgModule({ + imports: [SettingManagementModule], +}) +export class SettingManagementWrapperModule {} diff --git a/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts b/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts index 7af86a49c9..dac3704a06 100644 --- a/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts +++ b/npm/ng-packs/packages/account-config/src/lib/services/account-config.service.ts @@ -1,4 +1,4 @@ -import { ABP_ROUTES, eLayoutType, RestService } from '@abp/ng.core'; +import { eLayoutType, RestService, addAbpRoutes } from '@abp/ng.core'; import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; @@ -7,7 +7,7 @@ import { Router } from '@angular/router'; }) export class AccountConfigService { constructor(private router: Router, private restService: RestService) { - ABP_ROUTES.push({ + addAbpRoutes({ name: 'AbpAccount::Menu:Account', path: 'account', invisible: true, diff --git a/npm/ng-packs/packages/account/ng-package.json b/npm/ng-packs/packages/account/ng-package.json index 9e94619264..ad23aa3fd2 100644 --- a/npm/ng-packs/packages/account/ng-package.json +++ b/npm/ng-packs/packages/account/ng-package.json @@ -4,5 +4,5 @@ "lib": { "entryFile": "src/public-api.ts" }, - "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared"] + "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared", "abp/ng.account.config"] } diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 495b427bf3..a0e5dae2da 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -2,7 +2,8 @@ "name": "@abp/ng.account", "version": "0.9.0", "dependencies": { - "@abp/ng.theme.shared": "^0.9.0" + "@abp/ng.theme.shared": "^0.9.0", + "abp/ng.account.config": "^0.0.1" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/account/src/lib/services/account.service.ts b/npm/ng-packs/packages/account/src/lib/services/account.service.ts index 5061cfeea1..6c2571a518 100644 --- a/npm/ng-packs/packages/account/src/lib/services/account.service.ts +++ b/npm/ng-packs/packages/account/src/lib/services/account.service.ts @@ -4,7 +4,7 @@ import { RestService, Rest } from '@abp/ng.core'; import { RegisterResponse, RegisterRequest, TenantIdResponse } from '../models'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class AccountService { constructor(private rest: RestService) {} @@ -12,7 +12,7 @@ export class AccountService { findTenant(tenantName: string): Observable { const request: Rest.Request = { method: 'GET', - url: `/api/abp/multi-tenancy/tenants/by-name/${tenantName}` + url: `/api/abp/multi-tenancy/tenants/by-name/${tenantName}`, }; return this.rest.request(request); @@ -22,7 +22,7 @@ export class AccountService { const request: Rest.Request = { method: 'POST', url: '/api/account/register', - body + body, }; return this.rest.request(request, { skipHandleError: true }); diff --git a/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts b/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts index 2c15787f84..99ca53ebbd 100644 --- a/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts +++ b/npm/ng-packs/packages/core/src/lib/plugins/config/config.plugin.ts @@ -3,13 +3,11 @@ import { Router, Routes } from '@angular/router'; import { actionMatcher, InitState, NgxsNextPluginFn, NgxsPlugin, setValue, UpdateState } from '@ngxs/store'; import snq from 'snq'; import { ABP } from '../../models'; -import { organizeRoutes } from '../../utils/route-utils'; +import { organizeRoutes, getAbpRoutes } from '../../utils/route-utils'; import clone from 'just-clone'; export const NGXS_CONFIG_PLUGIN_OPTIONS = new InjectionToken('NGXS_CONFIG_PLUGIN_OPTIONS'); -export let ABP_ROUTES = [] as ABP.FullRoute[]; - @Injectable() export class ConfigPlugin implements NgxsPlugin { private initialized = false; @@ -42,24 +40,21 @@ export class ConfigPlugin implements NgxsPlugin { } function transformRoutes(routes: Routes = [], wrappers: ABP.FullRoute[] = []): any { - /** - * - * @deprecated since version 0.9.0 - */ - const abpRoutes: ABP.FullRoute[] = routes + // TODO: remove in v1 + const oldAbpRoutes: ABP.FullRoute[] = routes .filter(route => { return snq(() => route.data.routes.routes.find(r => r.path === route.path), false); }) .reduce((acc, val) => [...acc, ...val.data.routes.routes], []); // tslint:disable-next-line: deprecation - ABP_ROUTES = [...ABP_ROUTES, ...abpRoutes]; + const abpRoutes = [...getAbpRoutes(), ...oldAbpRoutes]; - wrappers = ABP_ROUTES.filter(ar => ar.wrapper); + wrappers = abpRoutes.filter(ar => ar.wrapper); const transformed = [] as ABP.FullRoute[]; routes .filter(route => route.component || route.loadChildren) .forEach(route => { - const abpPackage = ABP_ROUTES.find(abp => abp.path.toLowerCase() === route.path.toLowerCase() && !abp.wrapper); + const abpPackage = abpRoutes.find(abp => abp.path.toLowerCase() === route.path.toLowerCase() && !abp.wrapper); const { length } = transformed; diff --git a/npm/ng-packs/packages/core/src/lib/states/config.state.ts b/npm/ng-packs/packages/core/src/lib/states/config.state.ts index 1c0f533079..08bb79a171 100644 --- a/npm/ng-packs/packages/core/src/lib/states/config.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/config.state.ts @@ -230,6 +230,7 @@ export class ConfigState { }); } + if (typeof localization !== 'string') localization = ''; return localization || defaultValue || key; }, ); diff --git a/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts index 1cd4266924..b9560ddf87 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/config.plugin.spec.ts @@ -4,13 +4,13 @@ import { NGXS_PLUGINS, NgxsModule, InitState, Store } from '@ngxs/store'; import { environment } from '../../../../../apps/dev-app/src/environments/environment'; import { LAYOUTS } from '../../../../theme-basic/src/public-api'; import { ABP } from '../models'; -import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS, ABP_ROUTES } from '../plugins'; +import { ConfigPlugin, NGXS_CONFIG_PLUGIN_OPTIONS, addAbpRoutes } from '../plugins'; import { RouterOutletComponent } from '../components'; import { ConfigState } from '../states'; import { CoreModule } from '../core.module'; import { eLayoutType } from '../enums/common'; -ABP_ROUTES.push( +addAbpRoutes([ { name: 'AbpUiNavigation::Menu:Administration', path: '', @@ -54,7 +54,7 @@ ABP_ROUTES.push( }, ], }, -); +]); const expectedState = { environment, diff --git a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts index 2199fa1df6..05b7185d82 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/route-utils.ts @@ -60,3 +60,17 @@ export function sortRoutes(routes: ABP.FullRoute[] = []): ABP.FullRoute[] { return route; }); } + +const ABP_ROUTES = [] as ABP.FullRoute[]; + +export function addAbpRoutes(routes: ABP.FullRoute | ABP.FullRoute[]): void { + if (!Array.isArray(routes)) { + routes = [routes]; + } + + ABP_ROUTES.push(...routes); +} + +export function getAbpRoutes(): ABP.FullRoute[] { + return ABP_ROUTES; +} diff --git a/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts b/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts index fe78f8e810..960634809d 100644 --- a/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts +++ b/npm/ng-packs/packages/identity-config/src/lib/services/identity-config.service.ts @@ -1,4 +1,4 @@ -import { ABP_ROUTES, eLayoutType, RestService } from '@abp/ng.core'; +import { addAbpRoutes, eLayoutType, RestService } from '@abp/ng.core'; import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs'; @@ -8,7 +8,7 @@ import { Observable } from 'rxjs'; }) export class IdentityConfigService { constructor(private router: Router, private restService: RestService) { - ABP_ROUTES.push( + addAbpRoutes([ { name: 'AbpUiNavigation::Menu:Administration', path: '', @@ -27,6 +27,6 @@ export class IdentityConfigService { { path: 'users', name: 'AbpIdentity::Users', order: 1, requiredPolicy: 'AbpIdentity.Users' }, ], }, - ); + ]); } } diff --git a/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts b/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts index 851f435449..209c6741b1 100644 --- a/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts +++ b/npm/ng-packs/packages/setting-management-config/src/lib/services/setting-management-config.service.ts @@ -1,18 +1,29 @@ import { Injectable } from '@angular/core'; -import { ABP_ROUTES, eLayoutType } from '@abp/ng.core'; +import { addAbpRoutes, eLayoutType, PatchRouteByName, ABP } from '@abp/ng.core'; +import { getSettingTabs } from '@abp/ng.theme.shared'; +import { Store } from '@ngxs/store'; @Injectable({ providedIn: 'root', }) export class SettingManagementConfigService { - constructor() { - ABP_ROUTES.push({ - name: 'Settings', + constructor(private store: Store) { + const route = { + name: 'AbpSettingManagement::Settings', path: 'setting-management', parentName: 'AbpUiNavigation::Menu:Administration', layout: eLayoutType.application, order: 6, iconClass: 'fa fa-cog', + } as ABP.FullRoute; + + addAbpRoutes(route); + + setTimeout(() => { + const tabs = getSettingTabs(); + if (!tabs || !tabs.length) { + this.store.dispatch(new PatchRouteByName('AbpSettingManagement::Settings', { ...route, invisible: true })); + } }); } } diff --git a/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.ts b/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.ts index 17f0f93bb0..7a267b3517 100644 --- a/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.ts +++ b/npm/ng-packs/packages/setting-management/src/lib/components/setting-management.component.ts @@ -1,5 +1,5 @@ import { Component, TrackByFunction, OnInit } from '@angular/core'; -import { SettingTab, SETTING_TABS } from '@abp/ng.theme.shared'; +import { SettingTab, getSettingTabs } from '@abp/ng.theme.shared'; import { Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { ConfigState } from '@abp/ng.core'; @@ -18,9 +18,9 @@ export class SettingManagementComponent implements OnInit { constructor(private router: Router, private store: Store) {} ngOnInit() { - this.settings = SETTING_TABS.filter(setting => - this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy)), - ).sort((a, b) => a.order - b.order); + this.settings = getSettingTabs() + .filter(setting => this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy))) + .sort((a, b) => a.order - b.order); if (this.settings.length) { this.selected = this.settings[0]; } diff --git a/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts b/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts index 8d77d1005f..48a6d31c84 100644 --- a/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts +++ b/npm/ng-packs/packages/tenant-management-config/src/lib/services/tenant-management-config.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@angular/core'; -import { ABP_ROUTES, eLayoutType } from '@abp/ng.core'; +import { addAbpRoutes, eLayoutType } from '@abp/ng.core'; @Injectable({ providedIn: 'root', }) export class TenantManagementConfigService { constructor() { - ABP_ROUTES.push({ + addAbpRoutes({ name: 'AbpTenantManagement::Menu:TenantManagement', path: 'tenant-management', parentName: 'AbpUiNavigation::Menu:Administration', diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts index b9778da11f..1faeb40875 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/setting-management.ts @@ -7,4 +7,16 @@ export interface SettingTab { requiredPolicy?: string; } -export const SETTING_TABS = [] as SettingTab[]; +const SETTING_TABS = [] as SettingTab[]; + +export function addSettingTab(tab: SettingTab | SettingTab[]): void { + if (!Array.isArray(tab)) { + tab = [tab]; + } + + SETTING_TABS.push(...tab); +} + +export function getSettingTabs(): SettingTab[] { + return SETTING_TABS; +} diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 0ec7111eb6..6a8fb96d91 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -15,8 +15,9 @@ "dependencies": { "@abp/ng.account": "^0.9.0", "@abp/ng.identity": "^0.9.0", - "@abp/ng.tenant-management": "^0.9.0", "@abp/ng.theme.basic": "^0.9.0", + "@abp/ng.tenant-management": "^0.9.0", + "@abp/ng.setting-management": "^0.9.0", "@angular/animations": "~8.2.8", "@angular/common": "~8.2.8", "@angular/compiler": "~8.2.8", @@ -26,8 +27,8 @@ "@angular/platform-browser-dynamic": "~8.2.8", "@angular/router": "~8.2.8", "@angularclass/hmr": "^2.1.3", - "@ngxs/devtools-plugin": "^3.5.0", "@ngxs/hmr-plugin": "^3.5.0", + "@ngxs/devtools-plugin": "^3.5.0", "rxjs": "~6.4.0", "tslib": "^1.10.0", "zone.js": "~0.9.1" diff --git a/templates/app/angular/src/app/app-routing.module.ts b/templates/app/angular/src/app/app-routing.module.ts index d6fa06f853..bd2debf0cb 100644 --- a/templates/app/angular/src/app/app-routing.module.ts +++ b/templates/app/angular/src/app/app-routing.module.ts @@ -25,6 +25,11 @@ const routes: Routes = [ loadChildren: () => import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), }, + { + path: 'setting-management', + loadChildren: () => + import('./lazy-libs/setting-management-wrapper.module').then(m => m.SettingManagementWrapperModule), + }, ]; @NgModule({ diff --git a/templates/app/angular/src/app/app.module.ts b/templates/app/angular/src/app/app.module.ts index 9c5f3416de..26f3b24e1c 100644 --- a/templates/app/angular/src/app/app.module.ts +++ b/templates/app/angular/src/app/app.module.ts @@ -14,6 +14,7 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { AccountConfigModule } from '@abp/ng.account.config'; import { IdentityConfigModule } from '@abp/ng.identity.config'; import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management.config'; @NgModule({ declarations: [AppComponent], @@ -30,6 +31,7 @@ import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; AccountConfigModule.forRoot({ redirectUrl: '/' }), IdentityConfigModule, TenantManagementConfigModule, + SettingManagementConfigModule, BrowserModule, BrowserAnimationsModule, AppRoutingModule, diff --git a/templates/app/angular/src/app/lazy-libs/setting-management-wrapper.module.ts b/templates/app/angular/src/app/lazy-libs/setting-management-wrapper.module.ts new file mode 100644 index 0000000000..e5f3db8878 --- /dev/null +++ b/templates/app/angular/src/app/lazy-libs/setting-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { SettingManagementModule } from '@abp/ng.setting-management'; + +@NgModule({ + imports: [SettingManagementModule], +}) +export class SettingManagementWrapperModule {} diff --git a/templates/module/angular/.editorconfig b/templates/module/angular/.editorconfig new file mode 100644 index 0000000000..e89330a618 --- /dev/null +++ b/templates/module/angular/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/templates/module/angular/.gitignore b/templates/module/angular/.gitignore new file mode 100644 index 0000000000..c3569131e4 --- /dev/null +++ b/templates/module/angular/.gitignore @@ -0,0 +1,48 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +yarn.lock* \ No newline at end of file diff --git a/templates/module/angular/.npmrc b/templates/module/angular/.npmrc new file mode 100644 index 0000000000..5d05609c19 --- /dev/null +++ b/templates/module/angular/.npmrc @@ -0,0 +1 @@ +@volo:registry=http://192.168.1.45:4873/ \ No newline at end of file diff --git a/templates/module/angular/README.md b/templates/module/angular/README.md new file mode 100644 index 0000000000..04db0abd53 --- /dev/null +++ b/templates/module/angular/README.md @@ -0,0 +1 @@ +# MyProjectName \ No newline at end of file diff --git a/templates/module/angular/angular.json b/templates/module/angular/angular.json new file mode 100644 index 0000000000..1f298b967c --- /dev/null +++ b/templates/module/angular/angular.json @@ -0,0 +1,206 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "myProjectName": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/myProjectName", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": false, + "extractCss": true, + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "src/styles.scss", + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "node_modules/font-awesome/css/font-awesome.min.css", + "node_modules/primeng/resources/themes/nova-light/theme.css", + "node_modules/primeicons/primeicons.css", + "node_modules/primeng/resources/primeng.min.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + }, + "hmr": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.hmr.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "myProjectName:build" + }, + "configurations": { + "production": { + "browserTarget": "myProjectName:build:production" + }, + "hmr": { + "hmr": true, + "browserTarget": "myProjectName:build:hmr" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "myProjectName:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "src/styles.scss", + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "node_modules/font-awesome/css/font-awesome.min.css", + "node_modules/primeng/resources/themes/nova-light/theme.css", + "node_modules/primeicons/primeicons.css", + "node_modules/primeng/resources/primeng.min.css" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["tsconfig.app.json", "tsconfig.spec.json", "e2e/tsconfig.json"], + "exclude": ["**/node_modules/**"] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "myProjectName:serve" + }, + "configurations": { + "production": { + "devServerTarget": "myProjectName:serve:production" + } + } + } + } + }, + "my-project-name": { + "projectType": "library", + "root": "projects/my-project-name", + "sourceRoot": "projects/my-project-name/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/my-project-name/tsconfig.lib.json", + "project": "projects/my-project-name/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/my-project-name/src/test.ts", + "tsConfig": "projects/my-project-name/tsconfig.spec.json", + "karmaConfig": "projects/my-project-name/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/my-project-name/tsconfig.lib.json", + "projects/my-project-name/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "my-project-name-config": { + "projectType": "library", + "root": "projects/my-project-name-config", + "sourceRoot": "projects/my-project-name-config/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/my-project-name-config/tsconfig.lib.json", + "project": "projects/my-project-name-config/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/my-project-name-config/src/test.ts", + "tsConfig": "projects/my-project-name-config/tsconfig.spec.json", + "karmaConfig": "projects/my-project-name-config/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/my-project-name-config/tsconfig.lib.json", + "projects/my-project-name-config/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "myProjectName" +} diff --git a/templates/module/angular/browserslist b/templates/module/angular/browserslist new file mode 100644 index 0000000000..80848532e4 --- /dev/null +++ b/templates/module/angular/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/templates/module/angular/e2e/protractor.conf.js b/templates/module/angular/e2e/protractor.conf.js new file mode 100644 index 0000000000..73e4e6806c --- /dev/null +++ b/templates/module/angular/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/templates/module/angular/e2e/src/app.e2e-spec.ts b/templates/module/angular/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000000..ddea6e46a7 --- /dev/null +++ b/templates/module/angular/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to myProjectName!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/templates/module/angular/e2e/src/app.po.ts b/templates/module/angular/e2e/src/app.po.ts new file mode 100644 index 0000000000..5776aa9eb8 --- /dev/null +++ b/templates/module/angular/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root h1')).getText() as Promise; + } +} diff --git a/templates/module/angular/e2e/tsconfig.json b/templates/module/angular/e2e/tsconfig.json new file mode 100644 index 0000000000..39b800f789 --- /dev/null +++ b/templates/module/angular/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/templates/module/angular/karma.conf.js b/templates/module/angular/karma.conf.js new file mode 100644 index 0000000000..4e919a630c --- /dev/null +++ b/templates/module/angular/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/myProjectName'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json new file mode 100644 index 0000000000..6dc784d0c5 --- /dev/null +++ b/templates/module/angular/package.json @@ -0,0 +1,60 @@ +{ + "name": "my-project-name", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "start:hmr": "ng serve --configuration hmr", + "build": "ng build my-project-name", + "test": "ng test my-project-name", + "lint": "ng lint my-project-name", + "e2e": "ng e2e my-project-name" + }, + "private": true, + "dependencies": { + "@abp/ng.account": "^0.9.0", + "@abp/ng.theme.basic": "^0.9.0", + "@abp/ng.identity": "^0.9.0", + "@abp/ng.tenant-management": "^0.9.0", + "@abp/ng.setting-management": "^0.9.0", + "@angular/animations": "~8.2.8", + "@angular/common": "~8.2.8", + "@angular/compiler": "~8.2.8", + "@angular/core": "~8.2.8", + "@angular/forms": "~8.2.8", + "@angular/platform-browser": "~8.2.8", + "@angular/platform-browser-dynamic": "~8.2.8", + "@angular/router": "~8.2.8", + "@ngxs/devtools-plugin": "^3.5.0", + "@angularclass/hmr": "^2.1.3", + "@ngxs/hmr-plugin": "^3.5.0", + "rxjs": "~6.4.0", + "tslib": "^1.10.0", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.803.6", + "@angular-devkit/build-ng-packagr": "~0.803.6", + "@angular/cli": "~8.3.6", + "@angular/compiler-cli": "~8.2.8", + "@angular/language-service": "~8.2.8", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "~2.0.3", + "@types/node": "~8.9.4", + "codelyzer": "^5.0.0", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "ng-packagr": "^5.4.0", + "ngxs-schematic": "^1.1.9", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tsickle": "^0.37.0", + "tslint": "~5.15.0", + "typescript": "~3.5.3" + } +} diff --git a/templates/module/angular/projects/my-project-name-config/README.md b/templates/module/angular/projects/my-project-name-config/README.md new file mode 100644 index 0000000000..3fea508c67 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/README.md @@ -0,0 +1 @@ +# MyProjectNameConfig \ No newline at end of file diff --git a/templates/module/angular/projects/my-project-name-config/karma.conf.js b/templates/module/angular/projects/my-project-name-config/karma.conf.js new file mode 100644 index 0000000000..ea173152ce --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/my-project-name-config'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/templates/module/angular/projects/my-project-name-config/ng-package.json b/templates/module/angular/projects/my-project-name-config/ng-package.json new file mode 100644 index 0000000000..ed77c0b99d --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/my-project-name-config", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/templates/module/angular/projects/my-project-name-config/package.json b/templates/module/angular/projects/my-project-name-config/package.json new file mode 100644 index 0000000000..35666a4240 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "my-project-name.config", + "version": "0.0.1", + "peerDependencies": { + "@abp/ng.core": ">=0.9.0" + } +} diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/components/my-project-name-settings.component.ts b/templates/module/angular/projects/my-project-name-config/src/lib/components/my-project-name-settings.component.ts new file mode 100644 index 0000000000..39db5d23d5 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/lib/components/my-project-name-settings.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'my-project-name-settings', + template: ` +

MyProjectName Settings

+ `, +}) +export class MyProjectNameSettingsComponent {} diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts b/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts new file mode 100644 index 0000000000..1af221be40 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/lib/my-project-name-config.module.ts @@ -0,0 +1,12 @@ +import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { MyProjectNameConfigService } from './services/my-project-name-config.service'; +import { noop } from '@abp/ng.core'; +import { MyProjectNameSettingsComponent } from './components/my-project-name-settings.component'; + +@NgModule({ + declarations: [MyProjectNameSettingsComponent], + providers: [{ provide: APP_INITIALIZER, deps: [MyProjectNameConfigService], multi: true, useFactory: noop }], + exports: [MyProjectNameSettingsComponent], + entryComponents: [MyProjectNameSettingsComponent], +}) +export class MyProjectNameConfigModule {} diff --git a/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts b/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts new file mode 100644 index 0000000000..9cf1443edc --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/lib/services/my-project-name-config.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { eLayoutType, addAbpRoutes, ABP } from '@abp/ng.core'; +import { addSettingTab } from '@abp/ng.theme.shared'; +import { MyProjectNameSettingsComponent } from '../components/my-project-name-settings.component'; + +@Injectable({ + providedIn: 'root', +}) +export class MyProjectNameConfigService { + constructor() { + addAbpRoutes({ + name: 'MyProjectName', + path: 'my-project-name', + layout: eLayoutType.application, + order: 2, + } as ABP.FullRoute); + + const route = addSettingTab({ + component: MyProjectNameSettingsComponent, + name: 'MyProjectName Settings', + order: 1, + requiredPolicy: '', + }); + } +} diff --git a/templates/module/angular/projects/my-project-name-config/src/public-api.ts b/templates/module/angular/projects/my-project-name-config/src/public-api.ts new file mode 100644 index 0000000000..e931e6159e --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/public-api.ts @@ -0,0 +1,3 @@ +export * from './lib/components/my-project-name-settings.component'; +export * from './lib/services/my-project-name-config.service'; +export * from './lib/my-project-name-config.module'; diff --git a/templates/module/angular/projects/my-project-name-config/src/test.ts b/templates/module/angular/projects/my-project-name-config/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/src/test.ts @@ -0,0 +1,21 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/templates/module/angular/projects/my-project-name-config/tsconfig.lib.json b/templates/module/angular/projects/my-project-name-config/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/tsconfig.lib.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/templates/module/angular/projects/my-project-name-config/tsconfig.spec.json b/templates/module/angular/projects/my-project-name-config/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/templates/module/angular/projects/my-project-name-config/tslint.json b/templates/module/angular/projects/my-project-name-config/tslint.json new file mode 100644 index 0000000000..124133f849 --- /dev/null +++ b/templates/module/angular/projects/my-project-name-config/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "lib", + "camelCase" + ], + "component-selector": [ + true, + "element", + "lib", + "kebab-case" + ] + } +} diff --git a/templates/module/angular/projects/my-project-name/README.md b/templates/module/angular/projects/my-project-name/README.md new file mode 100644 index 0000000000..04db0abd53 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/README.md @@ -0,0 +1 @@ +# MyProjectName \ No newline at end of file diff --git a/templates/module/angular/projects/my-project-name/karma.conf.js b/templates/module/angular/projects/my-project-name/karma.conf.js new file mode 100644 index 0000000000..ef0285b27f --- /dev/null +++ b/templates/module/angular/projects/my-project-name/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/my-project-name'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/templates/module/angular/projects/my-project-name/ng-package.json b/templates/module/angular/projects/my-project-name/ng-package.json new file mode 100644 index 0000000000..d201249406 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/my-project-name", + "lib": { + "entryFile": "src/public-api.ts" + }, + "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared", "my-project-name.config"] +} diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json new file mode 100644 index 0000000000..91425b889b --- /dev/null +++ b/templates/module/angular/projects/my-project-name/package.json @@ -0,0 +1,8 @@ +{ + "name": "my-project-name", + "version": "0.0.1", + "dependencies": { + "@abp/ng.theme.shared": "^0.9.0", + "my-project-name.config": "^0.0.1" + } +} diff --git a/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.spec.ts b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.spec.ts new file mode 100644 index 0000000000..5dfc08774c --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MyProjectNameComponent } from './my-project-name.component'; + +describe('MyProjectNameComponent', () => { + let component: MyProjectNameComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MyProjectNameComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MyProjectNameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts new file mode 100644 index 0000000000..3f3fa9ec0d --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/components/my-project-name.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'lib-my-project-name', + template: ` +

+ my-project-name works! +

+ `, + styles: [] +}) +export class MyProjectNameComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts new file mode 100644 index 0000000000..5ef00189aa --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name-routing.module.ts @@ -0,0 +1,20 @@ +import { AuthGuard, DynamicLayoutComponent, PermissionGuard } from '@abp/ng.core'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { MyProjectNameComponent } from './components/my-project-name.component'; + +const routes: Routes = [ + { + path: '', + component: DynamicLayoutComponent, + canActivate: [AuthGuard, PermissionGuard], + data: { requiredPolicy: '' }, + children: [{ path: '', component: MyProjectNameComponent }], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MyProjectNameRoutingModule {} diff --git a/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts new file mode 100644 index 0000000000..a446b97bb5 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/lib/my-project-name.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { MyProjectNameComponent } from './components/my-project-name.component'; +import { MyProjectNameRoutingModule } from './my-project-name-routing.module'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { CoreModule } from '@abp/ng.core'; + +@NgModule({ + declarations: [MyProjectNameComponent], + imports: [CoreModule, ThemeSharedModule, MyProjectNameRoutingModule], + exports: [MyProjectNameComponent], +}) +export class MyProjectNameModule {} diff --git a/templates/module/angular/projects/my-project-name/src/public-api.ts b/templates/module/angular/projects/my-project-name/src/public-api.ts new file mode 100644 index 0000000000..06a1e26fb3 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/components/my-project-name.component'; +export * from './lib/my-project-name.module'; diff --git a/templates/module/angular/projects/my-project-name/src/test.ts b/templates/module/angular/projects/my-project-name/src/test.ts new file mode 100644 index 0000000000..978c64fb83 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/src/test.ts @@ -0,0 +1,21 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/templates/module/angular/projects/my-project-name/tsconfig.lib.json b/templates/module/angular/projects/my-project-name/tsconfig.lib.json new file mode 100644 index 0000000000..bd23948e59 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/tsconfig.lib.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/templates/module/angular/projects/my-project-name/tsconfig.spec.json b/templates/module/angular/projects/my-project-name/tsconfig.spec.json new file mode 100644 index 0000000000..16da33db07 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/templates/module/angular/projects/my-project-name/tslint.json b/templates/module/angular/projects/my-project-name/tslint.json new file mode 100644 index 0000000000..124133f849 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "lib", + "camelCase" + ], + "component-selector": [ + true, + "element", + "lib", + "kebab-case" + ] + } +} diff --git a/templates/module/angular/src/app/app-routing.module.ts b/templates/module/angular/src/app/app-routing.module.ts new file mode 100644 index 0000000000..1714a2e06e --- /dev/null +++ b/templates/module/angular/src/app/app-routing.module.ts @@ -0,0 +1,43 @@ +import { ABP } from '@abp/ng.core'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = [ + { + path: '', + loadChildren: () => import('./home/home.module').then(m => m.HomeModule), + data: { + routes: { + name: '::Menu:Home', + } as ABP.Route, + }, + }, + { + path: 'identity', + loadChildren: () => import('./lazy-libs/identity-wrapper.module').then(m => m.IdentityWrapperModule), + }, + { + path: 'tenant-management', + loadChildren: () => + import('./lazy-libs/tenant-management-wrapper.module').then(m => m.TenantManagementWrapperModule), + }, + { + path: 'account', + loadChildren: () => import('./lazy-libs/account-wrapper.module').then(m => m.AccountWrapperModule), + }, + { + path: 'setting-management', + loadChildren: () => + import('./lazy-libs/setting-management-wrapper.module').then(m => m.SettingManagementWrapperModule), + }, + { + path: 'my-project-name', + loadChildren: () => import('./lazy-libs/my-project-name-wrapper.module').then(m => m.MyProjectNameWrapperModule), + }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], +}) +export class AppRoutingModule {} diff --git a/templates/module/angular/src/app/app.component.ts b/templates/module/angular/src/app/app.component.ts new file mode 100644 index 0000000000..bf2a27962a --- /dev/null +++ b/templates/module/angular/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + template: ` + + + `, +}) +export class AppComponent {} diff --git a/templates/module/angular/src/app/app.module.ts b/templates/module/angular/src/app/app.module.ts new file mode 100644 index 0000000000..b670735c59 --- /dev/null +++ b/templates/module/angular/src/app/app.module.ts @@ -0,0 +1,46 @@ +import { CoreModule } from '@abp/ng.core'; +import { LAYOUTS } from '@abp/ng.theme.basic'; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { NgxsReduxDevtoolsPluginModule } from '@ngxs/devtools-plugin'; +import { NgxsModule } from '@ngxs/store'; +import { OAuthModule } from 'angular-oauth2-oidc'; +import { environment } from '../environments/environment'; +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { SharedModule } from './shared/shared.module'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { AccountConfigModule } from '@abp/ng.account.config'; +import { IdentityConfigModule } from '@abp/ng.identity.config'; +import { TenantManagementConfigModule } from '@abp/ng.tenant-management.config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management.config'; +import { MyProjectNameConfigModule } from '../../projects/my-project-name-config/src/public-api'; + +@NgModule({ + declarations: [AppComponent], + imports: [ + ThemeSharedModule.forRoot(), + CoreModule.forRoot({ + environment, + requirements: { + layouts: LAYOUTS, + }, + }), + OAuthModule.forRoot(), + NgxsModule.forRoot([]), + AccountConfigModule.forRoot({ redirectUrl: '/' }), + IdentityConfigModule, + TenantManagementConfigModule, + SettingManagementConfigModule, + MyProjectNameConfigModule, + BrowserModule, + BrowserAnimationsModule, + AppRoutingModule, + SharedModule, + + NgxsReduxDevtoolsPluginModule.forRoot({ disabled: environment.production }), + ], + bootstrap: [AppComponent], +}) +export class AppModule {} diff --git a/templates/module/angular/src/app/home/home-routing.module.ts b/templates/module/angular/src/app/home/home-routing.module.ts new file mode 100644 index 0000000000..367affb583 --- /dev/null +++ b/templates/module/angular/src/app/home/home-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { HomeComponent } from './home.component'; +import { ApplicationLayoutComponent } from '@abp/ng.theme.basic'; + +const routes: Routes = [ + { + path: '', + component: ApplicationLayoutComponent, + children: [{ path: '', component: HomeComponent }], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class HomeRoutingModule {} diff --git a/templates/module/angular/src/app/home/home.component.html b/templates/module/angular/src/app/home/home.component.html new file mode 100644 index 0000000000..4fafc67398 --- /dev/null +++ b/templates/module/angular/src/app/home/home.component.html @@ -0,0 +1,15 @@ +
+
{{ '::Welcome' | abpLocalization }}
+
+

+ {{ '::LongWelcomeMessage' | abpLocalization }} +

+

+ {{ 'AbpIdentity::Login' | abpLocalization }} +

+
+

abp.io

+
+
diff --git a/templates/module/angular/src/app/home/home.component.ts b/templates/module/angular/src/app/home/home.component.ts new file mode 100644 index 0000000000..aa56d34131 --- /dev/null +++ b/templates/module/angular/src/app/home/home.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { OAuthService } from 'angular-oauth2-oidc'; + +@Component({ + selector: 'abp-home', + templateUrl: './home.component.html', +}) +export class HomeComponent { + get hasLoggedIn(): boolean { + return this.oAuthService.hasValidAccessToken(); + } + + constructor(private oAuthService: OAuthService) {} +} diff --git a/templates/module/angular/src/app/home/home.module.ts b/templates/module/angular/src/app/home/home.module.ts new file mode 100644 index 0000000000..72d20ccc65 --- /dev/null +++ b/templates/module/angular/src/app/home/home.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from '../shared/shared.module'; +import { HomeRoutingModule } from './home-routing.module'; +import { HomeComponent } from './home.component'; + +@NgModule({ + declarations: [HomeComponent], + imports: [SharedModule, HomeRoutingModule], +}) +export class HomeModule {} diff --git a/templates/module/angular/src/app/lazy-libs/account-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/account-wrapper.module.ts new file mode 100644 index 0000000000..7130bb1a1a --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/account-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { AccountModule } from '@abp/ng.account'; + +@NgModule({ + imports: [AccountModule], +}) +export class AccountWrapperModule {} diff --git a/templates/module/angular/src/app/lazy-libs/identity-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/identity-wrapper.module.ts new file mode 100644 index 0000000000..fed1dcd1ec --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/identity-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { IdentityModule } from '@abp/ng.identity'; + +@NgModule({ + imports: [IdentityModule], +}) +export class IdentityWrapperModule {} diff --git a/templates/module/angular/src/app/lazy-libs/my-project-name-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/my-project-name-wrapper.module.ts new file mode 100644 index 0000000000..2f62d47b39 --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/my-project-name-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { MyProjectNameModule } from '../../../projects/my-project-name/src/public-api'; + +@NgModule({ + imports: [MyProjectNameModule], +}) +export class MyProjectNameWrapperModule {} diff --git a/templates/module/angular/src/app/lazy-libs/setting-management-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/setting-management-wrapper.module.ts new file mode 100644 index 0000000000..e5f3db8878 --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/setting-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { SettingManagementModule } from '@abp/ng.setting-management'; + +@NgModule({ + imports: [SettingManagementModule], +}) +export class SettingManagementWrapperModule {} diff --git a/templates/module/angular/src/app/lazy-libs/tenant-management-wrapper.module.ts b/templates/module/angular/src/app/lazy-libs/tenant-management-wrapper.module.ts new file mode 100644 index 0000000000..63eabda505 --- /dev/null +++ b/templates/module/angular/src/app/lazy-libs/tenant-management-wrapper.module.ts @@ -0,0 +1,7 @@ +import { NgModule } from '@angular/core'; +import { TenantManagementModule } from '@abp/ng.tenant-management'; + +@NgModule({ + imports: [TenantManagementModule], +}) +export class TenantManagementWrapperModule {} diff --git a/templates/module/angular/src/app/shared/shared.module.ts b/templates/module/angular/src/app/shared/shared.module.ts new file mode 100644 index 0000000000..6bae4ea332 --- /dev/null +++ b/templates/module/angular/src/app/shared/shared.module.ts @@ -0,0 +1,14 @@ +import { CoreModule } from '@abp/ng.core'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgModule } from '@angular/core'; +import { ThemeBasicModule } from '@abp/ng.theme.basic'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { TableModule } from 'primeng/table'; + +@NgModule({ + declarations: [], + imports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule], + exports: [CoreModule, ThemeSharedModule, ThemeBasicModule, TableModule, NgbDropdownModule], + providers: [], +}) +export class SharedModule {} diff --git a/templates/module/angular/src/assets/.gitkeep b/templates/module/angular/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/templates/module/angular/src/environments/environment.hmr.ts b/templates/module/angular/src/environments/environment.hmr.ts new file mode 100644 index 0000000000..64e134b252 --- /dev/null +++ b/templates/module/angular/src/environments/environment.hmr.ts @@ -0,0 +1,25 @@ +export const environment = { + production: false, + hmr: true, + application: { + name: 'MyProjectName', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'https://localhost:44305', + clientId: 'MyProjectName_App', + dummyClientSecret: '1q2w3e*', + scope: 'MyProjectName', + showDebugInformation: true, + oidc: false, + requireHttps: true, + }, + apis: { + default: { + url: 'https://localhost:44305', + }, + }, + localization: { + defaultResourceName: 'MyProjectName', + }, +}; diff --git a/templates/module/angular/src/environments/environment.prod.ts b/templates/module/angular/src/environments/environment.prod.ts new file mode 100644 index 0000000000..5b42ebace3 --- /dev/null +++ b/templates/module/angular/src/environments/environment.prod.ts @@ -0,0 +1,25 @@ +export const environment = { + production: true, + hmr: false, + application: { + name: 'MyProjectName', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'https://localhost:44305', + clientId: 'MyProjectName_App', + dummyClientSecret: '1q2w3e*', + scope: 'MyProjectName', + showDebugInformation: true, + oidc: false, + requireHttps: true, + }, + apis: { + default: { + url: 'https://localhost:44305', + }, + }, + localization: { + defaultResourceName: 'MyProjectName', + }, +}; diff --git a/templates/module/angular/src/environments/environment.ts b/templates/module/angular/src/environments/environment.ts new file mode 100644 index 0000000000..ca462ff043 --- /dev/null +++ b/templates/module/angular/src/environments/environment.ts @@ -0,0 +1,25 @@ +export const environment = { + production: false, + hmr: false, + application: { + name: 'MyProjectName', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'https://localhost:44305', + clientId: 'MyProjectName_App', + dummyClientSecret: '1q2w3e*', + scope: 'MyProjectName', + showDebugInformation: true, + oidc: false, + requireHttps: true, + }, + apis: { + default: { + url: 'https://localhost:44305', + }, + }, + localization: { + defaultResourceName: 'MyProjectName', + }, +}; diff --git a/templates/module/angular/src/favicon.ico b/templates/module/angular/src/favicon.ico new file mode 100644 index 0000000000..8081c7ceaf Binary files /dev/null and b/templates/module/angular/src/favicon.ico differ diff --git a/templates/module/angular/src/index.html b/templates/module/angular/src/index.html new file mode 100644 index 0000000000..151840662e --- /dev/null +++ b/templates/module/angular/src/index.html @@ -0,0 +1,16 @@ + + + + + MyProjectName + + + + + + + +
+
+ + diff --git a/templates/module/angular/src/main.ts b/templates/module/angular/src/main.ts new file mode 100644 index 0000000000..bbdf75c32d --- /dev/null +++ b/templates/module/angular/src/main.ts @@ -0,0 +1,20 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { BootstrapModuleFn as Bootstrap, hmr, WebpackModule } from '@ngxs/hmr-plugin'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +declare const module: WebpackModule; + +if (environment.production) { + enableProdMode(); +} + +const bootstrap: Bootstrap = () => platformBrowserDynamic().bootstrapModule(AppModule); + +if (environment.hmr) { + hmr(module, bootstrap).catch(err => console.error(err)); +} else { + bootstrap().catch(err => console.log(err)); +} diff --git a/templates/module/angular/src/polyfills.ts b/templates/module/angular/src/polyfills.ts new file mode 100644 index 0000000000..aa665d6b87 --- /dev/null +++ b/templates/module/angular/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/templates/module/angular/src/styles.scss b/templates/module/angular/src/styles.scss new file mode 100644 index 0000000000..d62aefa968 --- /dev/null +++ b/templates/module/angular/src/styles.scss @@ -0,0 +1,27 @@ +/* You can add global styles to this file, and also import other style files */ + +@keyframes donut-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +.donut { + display: inline-block; + border: 4px solid rgba(0, 0, 0, 0.1); + border-left-color: #7983ff; + border-radius: 50%; + width: 30px; + height: 30px; + animation: donut-spin 1.2s linear infinite; + + &.centered { + position: fixed; + top: 50%; + left: 50%; + /* bring your own prefixes */ + transform: translate(-50%, -50%); + } +} diff --git a/templates/module/angular/src/test.ts b/templates/module/angular/src/test.ts new file mode 100644 index 0000000000..16317897b1 --- /dev/null +++ b/templates/module/angular/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/templates/module/angular/tsconfig.app.json b/templates/module/angular/tsconfig.app.json new file mode 100644 index 0000000000..b750221da5 --- /dev/null +++ b/templates/module/angular/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/test.ts", "src/**/*.spec.ts"] +} diff --git a/templates/module/angular/tsconfig.json b/templates/module/angular/tsconfig.json new file mode 100644 index 0000000000..76dbb7747d --- /dev/null +++ b/templates/module/angular/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ], + "paths": { + "my-project-name": [ + "dist/my-project-name" + ], + "my-project-name/*": [ + "dist/my-project-name/*" + ], + "my-project-name-config": [ + "dist/my-project-name-config" + ], + "my-project-name-config/*": [ + "dist/my-project-name-config/*" + ] + } + } +} \ No newline at end of file diff --git a/templates/module/angular/tsconfig.spec.json b/templates/module/angular/tsconfig.spec.json new file mode 100644 index 0000000000..6400fde7d5 --- /dev/null +++ b/templates/module/angular/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/templates/module/angular/tslint.json b/templates/module/angular/tslint.json new file mode 100644 index 0000000000..188bd78d32 --- /dev/null +++ b/templates/module/angular/tslint.json @@ -0,0 +1,92 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warn" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file