diff --git a/templates/app-nolayers/angular/.browserslistrc b/templates/app-nolayers/angular/.browserslistrc
new file mode 100644
index 0000000000..427441dc93
--- /dev/null
+++ b/templates/app-nolayers/angular/.browserslistrc
@@ -0,0 +1,17 @@
+# 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
+
+# For the full list of supported browsers by the Angular framework, please see:
+# https://angular.io/guide/browser-support
+
+# You can see what browsers were selected by your queries by running:
+# npx browserslist
+
+last 1 Chrome version
+last 1 Firefox version
+last 2 Edge major versions
+last 2 Safari major versions
+last 2 iOS major versions
+Firefox ESR
+not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.
diff --git a/templates/app-nolayers/angular/.editorconfig b/templates/app-nolayers/angular/.editorconfig
new file mode 100644
index 0000000000..59d9a3a3e7
--- /dev/null
+++ b/templates/app-nolayers/angular/.editorconfig
@@ -0,0 +1,16 @@
+# 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
+
+[*.ts]
+quote_type = single
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/templates/app-nolayers/angular/.eslintrc.json b/templates/app-nolayers/angular/.eslintrc.json
new file mode 100644
index 0000000000..47c17dd9dd
--- /dev/null
+++ b/templates/app-nolayers/angular/.eslintrc.json
@@ -0,0 +1,50 @@
+{
+ "root": true,
+ "ignorePatterns": [
+ "projects/**/*"
+ ],
+ "overrides": [
+ {
+ "files": [
+ "*.ts"
+ ],
+ "parserOptions": {
+ "project": [
+ "tsconfig.json"
+ ],
+ "createDefaultProgram": true
+ },
+ "extends": [
+ "plugin:@angular-eslint/recommended",
+ "plugin:@angular-eslint/template/process-inline-templates"
+ ],
+ "rules": {
+ "@angular-eslint/directive-selector": [
+ "error",
+ {
+ "type": "attribute",
+ "prefix": "app",
+ "style": "camelCase"
+ }
+ ],
+ "@angular-eslint/component-selector": [
+ "error",
+ {
+ "type": "element",
+ "prefix": "app",
+ "style": "kebab-case"
+ }
+ ]
+ }
+ },
+ {
+ "files": [
+ "*.html"
+ ],
+ "extends": [
+ "plugin:@angular-eslint/template/recommended"
+ ],
+ "rules": {}
+ }
+ ]
+}
diff --git a/templates/app-nolayers/angular/.gitignore b/templates/app-nolayers/angular/.gitignore
new file mode 100644
index 0000000000..df2a9f5263
--- /dev/null
+++ b/templates/app-nolayers/angular/.gitignore
@@ -0,0 +1,46 @@
+# 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
+
+# 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
+/.angular/cache
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
+
+# System Files
+.DS_Store
+Thumbs.db
\ No newline at end of file
diff --git a/templates/app-nolayers/angular/.prettierrc b/templates/app-nolayers/angular/.prettierrc
new file mode 100644
index 0000000000..d0293174f3
--- /dev/null
+++ b/templates/app-nolayers/angular/.prettierrc
@@ -0,0 +1,5 @@
+{
+ "singleQuote": true,
+ "printWidth": 100,
+ "arrowParens": "avoid"
+}
diff --git a/templates/app-nolayers/angular/.vscode/extensions.json b/templates/app-nolayers/angular/.vscode/extensions.json
new file mode 100644
index 0000000000..5db7bc21ac
--- /dev/null
+++ b/templates/app-nolayers/angular/.vscode/extensions.json
@@ -0,0 +1,15 @@
+{
+ "recommendations": [
+ "angular.ng-template",
+ "esbenp.prettier-vscode",
+ "ms-vscode.vscode-typescript-tslint-plugin",
+ "visualstudioexptteam.vscodeintellicode",
+ "christian-kohler.path-intellisense",
+ "christian-kohler.npm-intellisense",
+ "Mikael.Angular-BeastCode",
+ "xabikos.JavaScriptSnippets",
+ "msjsdiag.debugger-for-chrome",
+ "donjayamanne.githistory",
+ "oderwat.indent-rainbow"
+ ]
+}
diff --git a/templates/app-nolayers/angular/README.md b/templates/app-nolayers/angular/README.md
new file mode 100644
index 0000000000..0c04d2a202
--- /dev/null
+++ b/templates/app-nolayers/angular/README.md
@@ -0,0 +1,27 @@
+# MyProjectName
+
+This is a startup project based on the ABP framework. For more information, visit abp.io
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via a platform of your choice.
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
diff --git a/templates/app-nolayers/angular/angular.json b/templates/app-nolayers/angular/angular.json
new file mode 100644
index 0000000000..213ab5ac67
--- /dev/null
+++ b/templates/app-nolayers/angular/angular.json
@@ -0,0 +1,146 @@
+{
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+ "cli": {
+ "analytics": false,
+ "defaultCollection": "@angular-eslint/schematics"
+ },
+ "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",
+ "inlineStyleLanguage": "scss",
+ "allowedCommonJsDependencies": ["chart.js", "js-sha256"],
+ "assets": ["src/favicon.ico", "src/assets"],
+ "styles": [
+ {
+ "input": "node_modules/@fortawesome/fontawesome-free/css/all.min.css",
+ "inject": true,
+ "bundleName": "fontawesome-all.min"
+ },
+ {
+ "input": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css",
+ "inject": true,
+ "bundleName": "fontawesome-v4-shims.min"
+ },
+ {
+ "input": "node_modules/@swimlane/ngx-datatable/index.css",
+ "inject": true,
+ "bundleName": "ngx-datatable-index"
+ },
+ {
+ "input": "node_modules/@swimlane/ngx-datatable/assets/icons.css",
+ "inject": true,
+ "bundleName": "ngx-datatable-icons"
+ },
+ {
+ "input": "node_modules/@swimlane/ngx-datatable/themes/material.css",
+ "inject": true,
+ "bundleName": "ngx-datatable-material"
+ },
+ {
+ "input": "node_modules/bootstrap/dist/css/bootstrap.rtl.min.css",
+ "inject": false,
+ "bundleName": "bootstrap-rtl.min"
+ },
+ {
+ "input": "node_modules/bootstrap/dist/css/bootstrap.min.css",
+ "inject": true,
+ "bundleName": "bootstrap-ltr.min"
+ },
+ "src/styles.scss"
+ ],
+ "scripts": []
+ },
+ "configurations": {
+ "production": {
+ "budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "2mb",
+ "maximumError": "2.5mb"
+ },
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "2kb",
+ "maximumError": "4kb"
+ }
+ ],
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.prod.ts"
+ }
+ ],
+ "outputHashing": "all"
+ },
+ "development": {
+ "buildOptimizer": false,
+ "optimization": false,
+ "vendorChunk": true,
+ "extractLicenses": false,
+ "sourceMap": true,
+ "namedChunks": true
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "serve": {
+ "builder": "@angular-devkit/build-angular:dev-server",
+ "configurations": {
+ "production": {
+ "browserTarget": "MyProjectName:build:production"
+ },
+ "development": {
+ "browserTarget": "MyProjectName:build:development"
+ }
+ },
+ "defaultConfiguration": "development"
+ },
+ "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",
+ "inlineStyleLanguage": "scss",
+ "assets": ["src/favicon.ico", "src/assets"],
+ "styles": ["src/styles.scss"],
+ "scripts": []
+ }
+ },
+ "lint": {
+ "builder": "@angular-eslint/builder:lint",
+ "options": {
+ "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
+ }
+ }
+ }
+ }
+ },
+ "defaultProject": "MyProjectName"
+}
diff --git a/templates/app-nolayers/angular/karma.conf.js b/templates/app-nolayers/angular/karma.conf.js
new file mode 100644
index 0000000000..b2fd9c40e8
--- /dev/null
+++ b/templates/app-nolayers/angular/karma.conf.js
@@ -0,0 +1,44 @@
+// 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'),
+ require('@angular-devkit/build-angular/plugins/karma')
+ ],
+ client: {
+ jasmine: {
+ // you can add configuration options for Jasmine here
+ // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
+ // for example, you can disable the random execution with `random: false`
+ // or set a specific seed with `seed: 4321`
+ },
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
+ },
+ jasmineHtmlReporter: {
+ suppressAll: true // removes the duplicated traces
+ },
+ coverageReporter: {
+ dir: require('path').join(__dirname, './coverage/MyProjectName'),
+ subdir: '.',
+ reporters: [
+ { type: 'html' },
+ { type: 'text-summary' }
+ ]
+ },
+ reporters: ['progress', 'kjhtml'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false,
+ restartOnFileChange: true
+ });
+};
diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json
new file mode 100644
index 0000000000..da06b7e718
--- /dev/null
+++ b/templates/app-nolayers/angular/package.json
@@ -0,0 +1,61 @@
+{
+ "name": "MyProjectName",
+ "version": "0.0.0",
+ "scripts": {
+ "ng": "ng",
+ "start": "ng serve --open",
+ "build": "ng build",
+ "build:prod": "ng build --configuration production",
+ "watch": "ng build --watch --configuration development",
+ "test": "ng test",
+ "lint": "ng lint"
+ },
+ "private": true,
+ "dependencies": {
+ "@abp/ng.account": "~5.1.3",
+ "@abp/ng.components": "~5.1.3",
+ "@abp/ng.core": "~5.1.3",
+ "@abp/ng.identity": "~5.1.3",
+ "@abp/ng.setting-management": "~5.1.3",
+ "@abp/ng.tenant-management": "~5.1.3",
+ "@abp/ng.theme.basic": "~5.1.3",
+ "@abp/ng.theme.shared": "~5.1.3",
+ "@angular/animations": "~13.1.1",
+ "@angular/common": "~13.1.1",
+ "@angular/compiler": "~13.1.1",
+ "@angular/core": "~13.1.1",
+ "@angular/forms": "~13.1.1",
+ "@angular/localize": "~13.1.1",
+ "@angular/platform-browser": "~13.1.1",
+ "@angular/platform-browser-dynamic": "~13.1.1",
+ "@angular/router": "~13.1.1",
+ "rxjs": "~6.6.0",
+ "tslib": "^2.1.0",
+ "zone.js": "~0.11.4"
+ },
+ "devDependencies": {
+ "@abp/ng.schematics": "~5.1.3",
+ "@angular-devkit/build-angular": "~13.1.2",
+ "@angular-eslint/builder": "~13.0.1",
+ "@angular-eslint/eslint-plugin": "~13.0.1",
+ "@angular-eslint/eslint-plugin-template": "~13.0.1",
+ "@angular-eslint/schematics": "~13.0.1",
+ "@angular-eslint/template-parser": "~13.0.1",
+ "@angular/cli": "~13.1.2",
+ "@angular/compiler-cli": "~13.1.1",
+ "@angular/language-service": "~13.1.1",
+ "@types/jasmine": "~3.6.0",
+ "@types/node": "^12.11.1",
+ "@typescript-eslint/eslint-plugin": "5.3.0",
+ "@typescript-eslint/parser": "5.3.0",
+ "eslint": "^8.2.0",
+ "jasmine-core": "~3.7.0",
+ "karma": "~6.3.0",
+ "karma-chrome-launcher": "~3.1.0",
+ "karma-coverage": "~2.1.0",
+ "karma-jasmine": "~4.0.0",
+ "karma-jasmine-html-reporter": "^1.7.0",
+ "ng-packagr": "^13.1.2",
+ "typescript": "~4.5.4"
+ }
+}
diff --git a/templates/app-nolayers/angular/src/app/app-routing.module.ts b/templates/app-nolayers/angular/src/app/app-routing.module.ts
new file mode 100644
index 0000000000..178c182324
--- /dev/null
+++ b/templates/app-nolayers/angular/src/app/app-routing.module.ts
@@ -0,0 +1,34 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+const routes: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadChildren: () => import('./home/home.module').then(m => m.HomeModule),
+ },
+ {
+ path: 'account',
+ loadChildren: () => import('@abp/ng.account').then(m => m.AccountModule.forLazy()),
+ },
+ {
+ 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()),
+ },
+];
+
+@NgModule({
+ imports: [RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' })],
+ exports: [RouterModule],
+})
+export class AppRoutingModule {}
diff --git a/templates/app-nolayers/angular/src/app/app.component.ts b/templates/app-nolayers/angular/src/app/app.component.ts
new file mode 100644
index 0000000000..a26e745334
--- /dev/null
+++ b/templates/app-nolayers/angular/src/app/app.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-root',
+ template: `
+
{{ '::LongWelcomeMessage' | abpLocalization }}
+ + {{ 'AbpAccount::Login' | abpLocalization }} +Here are some links to help you get started:
++ + + + +
+A Complete Web Application Platform Built on the ABP Framework
++ ABP Commercial is a platform based + on the open source ABP framework. It provides pre-built application modules, rapid + application development tooling, professional UI themes, premium support and more. +
+ ++ Abp Framework + Abp Commercial + abpframework +
+