diff --git a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts index 93214442ea..c1413d73ab 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts @@ -33,10 +33,10 @@ describe('Routes Service', () => { const visible = await service.visible$.pipe(take(1)).toPromise(); expect(flat.length).toBe(4); - expect(flat[0].name).toBe('foo'); - expect(flat[1].name).toBe('baz'); - expect(flat[2].name).toBe('x'); - expect(flat[3].name).toBe('bar'); + expect(flat[3].name).toBe('foo'); + expect(flat[0].name).toBe('baz'); + expect(flat[1].name).toBe('x'); + expect(flat[2].name).toBe('bar'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); @@ -88,8 +88,8 @@ describe('Routes Service', () => { const visible = service.visible; expect(flat.length).toBe(2); - expect(flat[0].name).toBe('foo'); - expect(flat[1].name).toBe('x'); + expect(flat[1].name).toBe('foo'); + expect(flat[0].name).toBe('x'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); @@ -114,10 +114,10 @@ describe('Routes Service', () => { const visible = service.visible; expect(flat.length).toBe(4); - expect(flat[0].name).toBe('foo'); - expect(flat[1].name).toBe('baz'); - expect(flat[2].name).toBe('x'); - expect(flat[3].name).toBe('bar'); + expect(flat[3].name).toBe('foo'); + expect(flat[0].name).toBe('baz'); + expect(flat[1].name).toBe('x'); + expect(flat[2].name).toBe('bar'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); diff --git a/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts b/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts index 1020e60d4e..4aabf7bf80 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts @@ -15,7 +15,7 @@ export class FeatureManagementService { getFeatures(params: FeatureManagement.Provider): Observable { const request: Rest.Request = { method: 'GET', - url: '/api/abp/features', + url: '/api/feature-management/features', params, }; return this.rest.request(request, { @@ -30,7 +30,7 @@ export class FeatureManagementService { }: FeatureManagement.Provider & FeatureManagement.Features): Observable { const request: Rest.Request = { method: 'PUT', - url: '/api/abp/features', + url: '/api/feature-management/features', body: { features }, params: { providerKey, providerName }, }; diff --git a/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts b/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts index fa6433e952..4825036f81 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts @@ -16,7 +16,7 @@ export class PermissionManagementService { ): Observable { const request: Rest.Request = { method: 'GET', - url: '/api/abp/permissions', + url: '/api/permission-management/permissions', params, }; @@ -33,7 +33,7 @@ export class PermissionManagementService { }: PermissionManagement.GrantedProvider & PermissionManagement.UpdateRequest): Observable { const request: Rest.Request = { method: 'PUT', - url: '/api/abp/permissions', + url: '/api/permission-management/permissions', body: { permissions }, params: { providerKey, providerName }, }; diff --git a/templates/app/angular/browserslist b/templates/app/angular/.browserslistrc similarity index 100% rename from templates/app/angular/browserslist rename to templates/app/angular/.browserslistrc diff --git a/templates/app/angular/e2e/tsconfig.json b/templates/app/angular/e2e/tsconfig.json index 39b800f789..6b87cc425b 100644 --- a/templates/app/angular/e2e/tsconfig.json +++ b/templates/app/angular/e2e/tsconfig.json @@ -1,9 +1,9 @@ { - "extends": "../tsconfig.json", + "extends": "../tsconfig.base.json", "compilerOptions": { "outDir": "../out-tsc/e2e", "module": "commonjs", - "target": "es5", + "target": "es2018", "types": [ "jasmine", "jasminewd2", diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index efc61110a0..f6a8d6edb5 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -5,6 +5,7 @@ "ng": "ng", "start": "ng serve --open", "build": "ng build", + "build:prod": "ng build --prod", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" @@ -16,41 +17,39 @@ "@abp/ng.setting-management": "~2.9.0", "@abp/ng.tenant-management": "~2.9.0", "@abp/ng.theme.basic": "~2.9.0", - "@angular/animations": "~9.1.0", - "@angular/common": "~9.1.0", - "@angular/compiler": "~9.1.0", - "@angular/core": "~9.1.0", - "@angular/forms": "~9.1.0", - "@angular/platform-browser": "~9.1.0", - "@angular/platform-browser-dynamic": "~9.1.0", - "@angular/router": "~9.1.0", - "@swimlane/ngx-datatable": "^17.0.0", + "@angular/animations": "~10.0.1", + "@angular/common": "~10.0.1", + "@angular/compiler": "~10.0.1", + "@angular/core": "~10.0.1", + "@angular/forms": "~10.0.1", + "@angular/platform-browser": "~10.0.1", + "@angular/platform-browser-dynamic": "~10.0.1", + "@angular/router": "~10.0.1", "rxjs": "~6.5.4", - "tslib": "^1.10.0", + "tslib": "^2.0.0", "zone.js": "~0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.901.0", - "@angular-devkit/build-ng-packagr": "~0.901.0", - "@angular/cli": "~9.1.0", - "@angular/compiler-cli": "~9.1.0", - "@angular/language-service": "~9.1.0", - "@ngxs/logger-plugin": "^3.6.2", + "@angular-devkit/build-angular": "~0.1000.0", + "@angular-devkit/build-ng-packagr": "~0.1000.0", + "@angular/cli": "~10.0.0", + "@angular/compiler-cli": "~10.0.1", + "@angular/language-service": "~10.0.1", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", "codelyzer": "^5.1.2", "jasmine-core": "~3.5.0", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~4.4.1", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~5.0.0", "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~2.1.0", - "karma-jasmine": "~3.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "ng-packagr": "^9.0.0", - "protractor": "~5.4.3", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~3.3.0", + "karma-jasmine-html-reporter": "^1.5.0", + "ng-packagr": "^10.0.0", + "protractor": "~7.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~3.8.3" + "typescript": "~3.9.5" } } diff --git a/templates/app/angular/src/app/app-routing.module.ts b/templates/app/angular/src/app/app-routing.module.ts index 4a6658a089..793703a3ad 100644 --- a/templates/app/angular/src/app/app-routing.module.ts +++ b/templates/app/angular/src/app/app-routing.module.ts @@ -1,35 +1,37 @@ -import { ABP } from '@abp/ng.core'; +import { ABP, DynamicLayoutComponent } 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: 'account', - loadChildren: () => - import('@abp/ng.account').then((m) => m.AccountModule.forLazy({ redirectUrl: '/' })), - }, - { - path: 'identity', - loadChildren: () => import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), - }, - { - path: 'tenant-management', - loadChildren: () => - import('@abp/ng.tenant-management').then((m) => m.TenantManagementModule.forLazy()), - }, - { - path: 'setting-management', - loadChildren: () => - import('@abp/ng.setting-management').then((m) => m.SettingManagementModule.forLazy()), + component: DynamicLayoutComponent, + children: [ + { + path: '', + pathMatch: 'full', + loadChildren: () => import('./home/home.module').then((m) => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => + import('@abp/ng.account').then((m) => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then((m) => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then((m) => m.SettingManagementModule.forLazy()), + }, + ], }, ]; diff --git a/templates/app/angular/src/app/app.module.ts b/templates/app/angular/src/app/app.module.ts index 2ad5f8a7bc..3cfafc9098 100644 --- a/templates/app/angular/src/app/app.module.ts +++ b/templates/app/angular/src/app/app.module.ts @@ -8,13 +8,11 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NgxsLoggerPluginModule } from '@ngxs/logger-plugin'; import { NgxsModule } from '@ngxs/store'; import { environment } from '../environments/environment'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; - -const LOGGERS = [NgxsLoggerPluginModule.forRoot({ disabled: false })]; +import { APP_ROUTE_PROVIDER } from './route.provider'; @NgModule({ imports: [ @@ -31,9 +29,9 @@ const LOGGERS = [NgxsLoggerPluginModule.forRoot({ disabled: false })]; SettingManagementConfigModule.forRoot(), NgxsModule.forRoot(), ThemeBasicModule.forRoot(), - ...(environment.production ? [] : LOGGERS), ], declarations: [AppComponent], + providers: [APP_ROUTE_PROVIDER], bootstrap: [AppComponent], }) export class AppModule {} diff --git a/templates/app/angular/src/app/home/home-routing.module.ts b/templates/app/angular/src/app/home/home-routing.module.ts index 367affb583..0cce36228e 100644 --- a/templates/app/angular/src/app/home/home-routing.module.ts +++ b/templates/app/angular/src/app/home/home-routing.module.ts @@ -3,13 +3,7 @@ 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 }], - }, -]; +const routes: Routes = [{ path: '', component: HomeComponent }]; @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/templates/app/angular/src/app/route.provider.ts b/templates/app/angular/src/app/route.provider.ts new file mode 100644 index 0000000000..5a14ad7ba0 --- /dev/null +++ b/templates/app/angular/src/app/route.provider.ts @@ -0,0 +1,20 @@ +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + path: '/', + name: '::Menu:Home', + iconClass: 'fas fa-home', + order: 1, + layout: eLayoutType.application, + }, + ]); + }; +} diff --git a/templates/app/angular/tsconfig.app.json b/templates/app/angular/tsconfig.app.json index 29f5f5864e..81e534ed7b 100644 --- a/templates/app/angular/tsconfig.app.json +++ b/templates/app/angular/tsconfig.app.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "./tsconfig.base.json", "compilerOptions": { "outDir": "./out-tsc/app", "types": [] diff --git a/templates/app/angular/tsconfig.base.json b/templates/app/angular/tsconfig.base.json new file mode 100644 index 0000000000..2f67131c75 --- /dev/null +++ b/templates/app/angular/tsconfig.base.json @@ -0,0 +1,22 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": ["node_modules/@types"], + "lib": ["es2018", "dom"] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableIvy": true + } +} diff --git a/templates/app/angular/tsconfig.json b/templates/app/angular/tsconfig.json index 2f67131c75..7e00e70771 100644 --- a/templates/app/angular/tsconfig.json +++ b/templates/app/angular/tsconfig.json @@ -1,22 +1,17 @@ +/* + This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. + It is not intended to be used to perform a compilation. + + To learn more about this file see: https://angular.io/config/solution-tsconfig. +*/ { - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", - "typeRoots": ["node_modules/@types"], - "lib": ["es2018", "dom"] - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": true, - "strictInjectionParameters": true, - "enableIvy": true - } -} + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} \ No newline at end of file diff --git a/templates/app/angular/tsconfig.spec.json b/templates/app/angular/tsconfig.spec.json index 6400fde7d5..1db2e6ee9c 100644 --- a/templates/app/angular/tsconfig.spec.json +++ b/templates/app/angular/tsconfig.spec.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "./tsconfig.base.json", "compilerOptions": { "outDir": "./out-tsc/spec", "types": [ diff --git a/templates/app/angular/tslint.json b/templates/app/angular/tslint.json index c8d70f1520..58a97b08a5 100644 --- a/templates/app/angular/tslint.json +++ b/templates/app/angular/tslint.json @@ -1,8 +1,16 @@ { "extends": "tslint:recommended", "rules": { + "align": { + "options": [ + "parameters", + "statements" + ] + }, "array-type": false, "arrow-parens": false, + "arrow-return-shorthand": true, + "curly": true, "deprecation": { "severity": "warning" }, @@ -21,10 +29,17 @@ "app", "kebab-case" ], + "eofline": true, "import-blacklist": [ true, "rxjs/Rx" ], + "import-spacing": true, + "indent": { + "options": [ + "spaces" + ] + }, "interface-name": false, "max-classes-per-file": false, "max-line-length": [ @@ -71,6 +86,20 @@ true, "single" ], + "semicolon": { + "options": [ + "always" + ] + }, + "space-before-function-paren": { + "options": { + "anonymous": "never", + "asyncArrow": "always", + "constructor": "never", + "method": "never", + "named": "never" + } + }, "trailing-comma": false, "no-conflicting-lifecycle": true, "no-host-metadata-property": true, @@ -82,9 +111,44 @@ "no-outputs-metadata-property": true, "template-banana-in-box": true, "template-no-negated-async": true, + "typedef-whitespace": { + "options": [ + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ] + }, "use-lifecycle-interface": true, "use-pipe-transform-interface": true - }, + , "variable-name": { + "options": [ + "ban-keywords", + "check-format", + "allow-pascal-case" + ] + }, + "whitespace": { + "options": [ + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast" + ] + } +}, "rulesDirectory": [ "codelyzer" ] diff --git a/templates/module/angular/README.md b/templates/module/angular/README.md index 5f5ca53a7d..e284214f34 100644 --- a/templates/module/angular/README.md +++ b/templates/module/angular/README.md @@ -1,6 +1,6 @@ # MyProjectName -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.9. +This is a startup project based on the ABP framework. For more information, visit abp.io ## Development server diff --git a/templates/module/angular/projects/my-project-name/README.md b/templates/module/angular/projects/my-project-name/README.md index 182a550944..5181227a50 100644 --- a/templates/module/angular/projects/my-project-name/README.md +++ b/templates/module/angular/projects/my-project-name/README.md @@ -1,6 +1,6 @@ # MyProjectName -This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.11. +This is a startup project based on the ABP framework. For more information, visit abp.io