├── ClientApp ├── app │ └── components │ │ ├── home │ │ ├── home.ts │ │ └── home.html │ │ ├── counter │ │ ├── counter.ts │ │ └── counter.html │ │ ├── navmenu │ │ ├── navmenu.ts │ │ └── navmenu.html │ │ ├── app │ │ ├── app.scss │ │ ├── app.html │ │ └── app.ts │ │ └── fetchdata │ │ ├── fetchdata.ts │ │ └── fetchdata.html └── boot.ts ├── postcss.config.js ├── wwwroot └── favicon.ico ├── appsettings.Development.json ├── appsettings.json ├── .editorconfig ├── .travis.yml ├── tsconfig.json ├── Program.cs ├── index.ejs ├── tslint.json ├── AureliaDotnetTemplate.sln ├── Controllers └── SampleDataController.cs ├── README.md ├── package.json ├── Startup.cs ├── AureliaDotnetTemplate.csproj ├── webpack.config.js └── .gitignore /ClientApp/app/components/home/home.ts: -------------------------------------------------------------------------------- 1 | export class Home { 2 | } 3 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | 'cssnano': {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaximBalaganskiy/AureliaDotnetTemplate/HEAD/wwwroot/favicon.ico -------------------------------------------------------------------------------- /ClientApp/app/components/counter/counter.ts: -------------------------------------------------------------------------------- 1 | export class Counter { 2 | currentCount = 0; 3 | 4 | incrementCounter() { 5 | this.currentCount++; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /ClientApp/app/components/navmenu/navmenu.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "aurelia-router"; 2 | import { autoinject } from "aurelia-framework"; 3 | 4 | @autoinject 5 | export class Navmenu { 6 | constructor(private router: Router) { } 7 | } 8 | -------------------------------------------------------------------------------- /ClientApp/app/components/app/app.scss: -------------------------------------------------------------------------------- 1 | @media (max-width: 767px) { 2 | /* On small screens, the nav menu spans the full width of the screen. Leave a space for it. */ 3 | .body-content { 4 | padding-top: 50px; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | }, 9 | "AllowedHosts": "*" 10 | } 11 | -------------------------------------------------------------------------------- /ClientApp/app/components/app/app.html: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /ClientApp/app/components/counter/counter.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.cs] 2 | csharp_new_line_before_open_brace = none 3 | indent_style = tab 4 | indent_size = 4 5 | 6 | [*.{ts,js}] 7 | indent_style = tab 8 | indent_size = 4 9 | 10 | [**.json] 11 | indent_style = tab 12 | indent_size = 2 13 | 14 | [**.{html,xml,csproj}] 15 | indent_style = tab 16 | indent_size = 2 17 | 18 | [**.scss] 19 | indent_style = tab 20 | indent_size = 2 21 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | 5 | sudo: false 6 | 7 | notifications: 8 | email: false 9 | 10 | cache: 11 | directories: 12 | - node_modules 13 | 14 | branches: 15 | only: 16 | - master 17 | 18 | install: 19 | - npm install 20 | 21 | before_script: 22 | - export CHROME_BIN=chromium-browser 23 | - export DISPLAY=:99.0 24 | - sh -e /etc/init.d/xvfb start 25 | 26 | script: 27 | - npm run lint 28 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "es2015", 4 | "moduleResolution": "node", 5 | "target": "es5", 6 | "sourceMap": true, 7 | "experimentalDecorators": true, 8 | "emitDecoratorMetadata": true, 9 | "skipDefaultLibCheck": true, 10 | "strict": false, 11 | "lib": [ "es2015", "dom" ], 12 | "types": [ ] 13 | }, 14 | "exclude": [ "bin", "node_modules" ], 15 | "atom": { "rewriteTsconfig": false } 16 | } 17 | -------------------------------------------------------------------------------- /ClientApp/app/components/fetchdata/fetchdata.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from "aurelia-fetch-client"; 2 | import { inject } from "aurelia-framework"; 3 | 4 | @inject(HttpClient) 5 | export class Fetchdata { 6 | constructor(private http: HttpClient) { } 7 | 8 | forecasts: IWeatherForecast[]; 9 | 10 | async activate() { 11 | this.forecasts = await this.http.fetch("api/SampleData/WeatherForecasts").then(result => result.json() as Promise); 12 | } 13 | } 14 | 15 | interface IWeatherForecast { 16 | dateFormatted: string; 17 | temperatureC: number; 18 | temperatureF: number; 19 | summary: string; 20 | } 21 | -------------------------------------------------------------------------------- /ClientApp/boot.ts: -------------------------------------------------------------------------------- 1 | import "isomorphic-fetch"; 2 | import { Aurelia, PLATFORM } from "aurelia-framework"; 3 | import { HttpClient } from "aurelia-fetch-client"; 4 | import "bootstrap/dist/css/bootstrap.css"; 5 | import "bootstrap"; 6 | import "font-awesome/css/font-awesome.css"; 7 | declare const IS_DEV_BUILD: boolean; // The value is supplied by Webpack during the build 8 | 9 | export function configure(aurelia: Aurelia) { 10 | aurelia.use.standardConfiguration(); 11 | 12 | if (IS_DEV_BUILD) { 13 | aurelia.use.developmentLogging(); 14 | } 15 | 16 | aurelia.start().then(() => aurelia.setRoot("app/components/app/app")); 17 | } 18 | -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Hosting; 6 | using Microsoft.Extensions.Configuration; 7 | using Microsoft.Extensions.Hosting; 8 | using Microsoft.Extensions.Logging; 9 | 10 | namespace AureliaDotnetTemplate { 11 | public class Program { 12 | public static void Main(string[] args) { 13 | CreateHostBuilder(args).Build().Run(); 14 | } 15 | 16 | public static IHostBuilder CreateHostBuilder(string[] args) => 17 | Host.CreateDefaultBuilder(args) 18 | .ConfigureWebHostDefaults(webBuilder => { 19 | webBuilder.UseStartup(); 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <% for (var css in htmlWebpackPlugin.files.css) { %> 10 | 11 | <% } %> 12 | 13 | 14 |
15 |
Loading
16 |
17 | 18 | <% for (var chunk in htmlWebpackPlugin.files.chunks) { %> 19 | <% } %> 20 | 21 | 22 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "quotemark": [ true, "double" ], 9 | "indent": [ true, "tabs", 4 ], 10 | "member-access": [ true, "no-public" ], 11 | "member-ordering": [ 12 | true, 13 | { 14 | "order": [ "public-constructor" ] 15 | } 16 | ], 17 | "object-literal-sort-keys": false, 18 | "trailing-comma": false, 19 | "arrow-parens": false, 20 | "only-arrow-functions": false, 21 | "align": false, 22 | "array-type": false, 23 | "max-line-length": false, 24 | "one-line": false, 25 | "ordered-imports": false, 26 | "no-string-literal": false, 27 | "prefer-const": false 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ClientApp/app/components/navmenu/navmenu.html: -------------------------------------------------------------------------------- 1 | 19 | -------------------------------------------------------------------------------- /ClientApp/app/components/app/app.ts: -------------------------------------------------------------------------------- 1 | import { Aurelia, PLATFORM } from "aurelia-framework"; 2 | import { Router, RouterConfiguration } from "aurelia-router"; 3 | 4 | export class App { 5 | configureRouter(config: RouterConfiguration, router: Router) { 6 | config.title = "AureliaDotnetTemplate"; 7 | config.map([{ 8 | route: ["", "home"], 9 | name: "home", 10 | settings: { icon: "fa fa-home" }, 11 | moduleId: "../home/home", 12 | nav: true, 13 | title: "Home" 14 | }, { 15 | route: "counter", 16 | name: "counter", 17 | settings: { icon: "fa fa-plus" }, 18 | moduleId: "../counter/counter", 19 | nav: true, 20 | title: "Counter" 21 | }, { 22 | route: "fetch-data", 23 | name: "fetchdata", 24 | settings: { icon: "fa fa-list" }, 25 | moduleId: "../fetchdata/fetchdata", 26 | nav: true, 27 | title: "Fetch data" 28 | }]); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ClientApp/app/components/fetchdata/fetchdata.html: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /AureliaDotnetTemplate.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27428.2037 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AureliaDotnetTemplate", "AureliaDotnetTemplate.csproj", "{D01535D7-2B98-4769-8341-5DDE2FDDE860}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {D01535D7-2B98-4769-8341-5DDE2FDDE860}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {D01535D7-2B98-4769-8341-5DDE2FDDE860}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {D01535D7-2B98-4769-8341-5DDE2FDDE860}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {D01535D7-2B98-4769-8341-5DDE2FDDE860}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {951EAC4F-38A1-43F3-8714-2087565ADBFC} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Controllers/SampleDataController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Mvc; 6 | 7 | namespace AureliaDotnetTemplate.Controllers { 8 | [Route("api/[controller]")] 9 | [ApiController] 10 | public class SampleDataController : Controller { 11 | private static string[] Summaries = new[] 12 | { 13 | "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" 14 | }; 15 | 16 | [HttpGet("WeatherForecasts")] 17 | public IEnumerable WeatherForecasts() { 18 | var rng = new Random(); 19 | return Enumerable.Range(1, 5).Select(index => new WeatherForecast { 20 | DateFormatted = DateTime.Now.AddDays(index).ToString("d"), 21 | TemperatureC = rng.Next(-20, 55), 22 | Summary = Summaries[rng.Next(Summaries.Length)] 23 | }); 24 | } 25 | 26 | public class WeatherForecast { 27 | public string DateFormatted { get; set; } 28 | public int TemperatureC { get; set; } 29 | public string Summary { get; set; } 30 | 31 | public int TemperatureF { 32 | get { 33 | return 32 + (int)(this.TemperatureC / 0.5556); 34 | } 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Aurelia .Net Template 2 | This project has picked up where the official Microsoft Aurelia template left. 3 | It's got more clear webpack configuration and latest Aurelia and Bootstrap packages. 4 | Those interested in [Materialize](http://materializecss.com) instead of Bootstrap please proceed to [Aurelia .Net Materialize Template](https://github.com/MaximBalaganskiy/AureliaDotnetTemplateMaterialize). 5 | 6 | Basically, there are two coexisting applications in this template - one is Asp.Net Core Web Api which additionaly serves local files and the second one is an Aurelia app. 7 | Previously, the template used Asp.Net Spa Services to start a webpack dev server for development. This does not happen anymore. 8 | Why? It is causing a webpack rebuild each time you recompile C# code (trust me, it IS SLOW on a decent sized project), which is not practical when Api and UI are developed in parallel. 9 | 10 | Instead, when developing UI, just run `npm run webpack:watch` in the background. The Asp.Net Core FileServer middleware will serve the fresh files when you refresh the browser. 11 | Yes, this means no HMR, but, honestly, it does not work more often than it does, especially when `ValidationController` is injected into an Aurelia view. 12 | 13 | The template is obviously opinionated but always open to suggestions and PRs. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aurelia-dotnet-template", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "lint": "tslint --project tsconfig.json", 7 | "webpack:Debug": "webpack --mode development", 8 | "webpack:Release": "webpack --mode production", 9 | "webpack:watch": "webpack --mode development --watch" 10 | }, 11 | "devDependencies": { 12 | "aurelia-binding": "^2.3.1", 13 | "aurelia-bootstrapper": "^2.3.3", 14 | "aurelia-fetch-client": "^1.8.2", 15 | "aurelia-webpack-plugin": "^4.0.0", 16 | "awesome-typescript-loader": "^5.2.1", 17 | "bootstrap": "^4.3.1", 18 | "clean-webpack-plugin": "^2.0.2", 19 | "css-loader": "^2.1.1", 20 | "es6-promise": "^4.2.6", 21 | "file-loader": "^3.0.1", 22 | "font-awesome": "^4.7.0", 23 | "html-loader": "^0.5.5", 24 | "html-webpack-plugin": "^3.2.0", 25 | "isomorphic-fetch": "^2.2.1", 26 | "jquery": "^3.4.1", 27 | "mini-css-extract-plugin": "^0.6.0", 28 | "node-sass": "^4.12.0", 29 | "optimize-css-assets-webpack-plugin": "^5.0.1", 30 | "popper.js": "^1.15.0", 31 | "postcss-loader": "^3.0.0", 32 | "sass-loader": "^7.1.0", 33 | "style-loader": "^0.23.1", 34 | "ts-loader": "^6.0.1", 35 | "tslint": "^5.16.0", 36 | "typescript": "^3.4.5", 37 | "url-loader": "^1.1.2", 38 | "webpack": "^4.32.2", 39 | "webpack-cli": "^3.3.2" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /ClientApp/app/components/home/home.html: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /Startup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Microsoft.AspNetCore.Builder; 6 | using Microsoft.AspNetCore.Hosting; 7 | using Microsoft.AspNetCore.HttpsPolicy; 8 | using Microsoft.Extensions.Configuration; 9 | using Microsoft.Extensions.DependencyInjection; 10 | using Microsoft.Extensions.Hosting; 11 | 12 | namespace AureliaDotnetTemplate { 13 | public class Startup { 14 | public Startup(IConfiguration configuration) { 15 | Configuration = configuration; 16 | } 17 | 18 | public IConfiguration Configuration { get; } 19 | 20 | // This method gets called by the runtime. Use this method to add services to the container. 21 | public void ConfigureServices(IServiceCollection services) { 22 | services.Configure(options => { 23 | // This lambda determines whether user consent for non-essential cookies is needed for a given request. 24 | options.CheckConsentNeeded = context => true; 25 | }); 26 | 27 | 28 | services.AddRazorPages() 29 | .AddNewtonsoftJson(); 30 | } 31 | 32 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 33 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { 34 | if (env.IsDevelopment()) { 35 | app.UseDeveloperExceptionPage(); 36 | } 37 | else { 38 | app.UseExceptionHandler("/Error"); 39 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 40 | app.UseHsts(); 41 | } 42 | 43 | app.UseHttpsRedirection(); 44 | app.UseFileServer(); 45 | 46 | app.UseRouting(); 47 | 48 | app.UseAuthorization(); 49 | 50 | app.UseEndpoints(endpoints => { 51 | endpoints.MapControllers(); 52 | }); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /AureliaDotnetTemplate.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp3.0 5 | true 6 | Latest 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | <_WebpackFiles Include="wwwroot\dist\**" /> 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const webpack = require("webpack"); 3 | const { AureliaPlugin, ModuleDependenciesPlugin, GlobDependenciesPlugin } = require("aurelia-webpack-plugin"); 4 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 5 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 6 | const CleanWebpackPlugin = require("clean-webpack-plugin"); 7 | 8 | const bundleOutputDir = "./wwwroot/dist"; 9 | 10 | module.exports = (env, argv) => { 11 | if ((!argv || !argv.mode) && process.env.ASPNETCORE_ENVIRONMENT === "Development") { 12 | argv = { mode: "development" }; 13 | } 14 | console.log("mode =", argv.mode); 15 | const isDevBuild = argv.mode !== "production"; 16 | const cssLoaders = ["css-loader", "postcss-loader"]; 17 | const scssLoaders = [...cssLoaders, "sass-loader"]; 18 | 19 | return [{ 20 | target: "web", 21 | mode: isDevBuild ? "development" : "production", 22 | entry: { "app": ["es6-promise/auto", "aurelia-bootstrapper"] }, 23 | resolve: { 24 | extensions: [".ts", ".js"], 25 | modules: ["ClientApp", "node_modules"] 26 | }, 27 | output: { 28 | path: path.resolve(bundleOutputDir), 29 | // Asp.Net JavaScriptServices does not tolerate "/" in public path, see https://github.com/aspnet/JavaScriptServices/issues/1495 30 | publicPath: "dist/", 31 | filename: "[name].[hash].js", 32 | chunkFilename: "[name].[chunkhash].js", 33 | pathinfo: false 34 | }, 35 | module: { 36 | rules: [ 37 | { test: /\.(woff|woff2|png|eot|ttf|svg)(\?|$)/, use: { loader: "url-loader", options: { limit: 1, publicPath: "./" } } }, 38 | { test: /\.ts$/i, include: [/ClientApp/], loader: "ts-loader" }, 39 | { test: /\.html$/i, use: "html-loader" }, 40 | { test: /\.css$/i, include: [/node_modules/], issuer: /\.html$/i, use: cssLoaders }, 41 | { test: /\.css$/i, include: [/node_modules/], exclude: [/bootstrap.css$/, /font-awesome.css$/], issuer: [{ not: [{ test: /\.html$/i }] }], use: ["style-loader", ...cssLoaders] }, 42 | { test: /\.css$/, include: [/bootstrap.css$/, /font-awesome.css$/], use: [{ loader: MiniCssExtractPlugin.loader }, ...cssLoaders] }, 43 | { test: /\.scss$/i, issuer: /(\.html|empty-entry\.js)$/i, use: scssLoaders }, 44 | { test: /\.scss$/i, issuer: /\.ts$/i, use: ["style-loader", ...scssLoaders] } 45 | ] 46 | }, 47 | optimization: { 48 | splitChunks: { 49 | chunks: "all", 50 | // comment the following to avoid creatin a separate bundle for each npm module 51 | maxInitialRequests: Infinity, 52 | minSize: 0, 53 | cacheGroups: { 54 | vendor: { 55 | test: /[\\/]node_modules[\\/]/, 56 | name(module) { 57 | // get the name. E.g. node_modules/packageName/not/this/part.js 58 | // or node_modules/packageName 59 | const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]; 60 | 61 | // npm package names are URL-safe, but some servers don't like @ symbols 62 | return `npm.${packageName.replace('@', '')}`; 63 | } 64 | } 65 | } 66 | } 67 | }, 68 | devtool: isDevBuild ? "source-map" : false, 69 | performance: { 70 | hints: false 71 | }, 72 | plugins: [ 73 | new CleanWebpackPlugin(), 74 | new webpack.DefinePlugin({ IS_DEV_BUILD: JSON.stringify(isDevBuild) }), 75 | new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "window.jQuery": "jquery" }), 76 | new HtmlWebpackPlugin({ template: 'index.ejs', filename: "../../wwwroot/index.html", inject: false, metadata: {}, alwaysWriteToDisk: true }), 77 | new AureliaPlugin({ aureliaApp: "boot" }), 78 | new GlobDependenciesPlugin({ "boot": ["ClientApp/**/*.{ts,html}"] }), 79 | new ModuleDependenciesPlugin({}), 80 | new MiniCssExtractPlugin({ 81 | filename: "[name].[hash].css", 82 | chunkFilename: "[name].[chunkhash].css" 83 | }) 84 | ], 85 | devServer: { 86 | contentBase: "wwwroot/", 87 | compress: true, 88 | writeToDisk: true, 89 | hot: false 90 | } 91 | }]; 92 | }; 93 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /Properties/launchSettings.json 2 | 3 | ## Ignore Visual Studio temporary files, build results, and 4 | ## files generated by popular Visual Studio add-ons. 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | build/ 23 | bld/ 24 | bin/ 25 | Bin/ 26 | obj/ 27 | Obj/ 28 | 29 | # Visual Studio 2015 cache/options directory 30 | .vs/ 31 | /wwwroot/dist/ 32 | /ClientApp/dist/ 33 | 34 | /yarn.lock 35 | 36 | # MSTest test Results 37 | [Tt]est[Rr]esult*/ 38 | [Bb]uild[Ll]og.* 39 | 40 | # NUNIT 41 | *.VisualState.xml 42 | TestResult.xml 43 | 44 | # Build Results of an ATL Project 45 | [Dd]ebugPS/ 46 | [Rr]eleasePS/ 47 | dlldata.c 48 | 49 | *_i.c 50 | *_p.c 51 | *_i.h 52 | *.ilk 53 | *.meta 54 | *.obj 55 | *.pch 56 | *.pdb 57 | *.pgc 58 | *.pgd 59 | *.rsp 60 | *.sbr 61 | *.tlb 62 | *.tli 63 | *.tlh 64 | *.tmp 65 | *.tmp_proj 66 | *.log 67 | *.vspscc 68 | *.vssscc 69 | .builds 70 | *.pidb 71 | *.svclog 72 | *.scc 73 | 74 | # Chutzpah Test files 75 | _Chutzpah* 76 | 77 | # Visual C++ cache files 78 | ipch/ 79 | *.aps 80 | *.ncb 81 | *.opendb 82 | *.opensdf 83 | *.sdf 84 | *.cachefile 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | *.sap 91 | 92 | # TFS 2012 Local Workspace 93 | $tf/ 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | *.DotSettings.user 102 | 103 | # JustCode is a .NET coding add-in 104 | .JustCode 105 | 106 | # TeamCity is a build add-in 107 | _TeamCity* 108 | 109 | # DotCover is a Code Coverage Tool 110 | *.dotCover 111 | 112 | # NCrunch 113 | _NCrunch_* 114 | .*crunch*.local.xml 115 | nCrunchTemp_* 116 | 117 | # MightyMoose 118 | *.mm.* 119 | AutoTest.Net/ 120 | 121 | # Web workbench (sass) 122 | .sass-cache/ 123 | 124 | # Installshield output folder 125 | [Ee]xpress/ 126 | 127 | # DocProject is a documentation generator add-in 128 | DocProject/buildhelp/ 129 | DocProject/Help/*.HxT 130 | DocProject/Help/*.HxC 131 | DocProject/Help/*.hhc 132 | DocProject/Help/*.hhk 133 | DocProject/Help/*.hhp 134 | DocProject/Help/Html2 135 | DocProject/Help/html 136 | 137 | # Click-Once directory 138 | publish/ 139 | 140 | # Publish Web Output 141 | *.[Pp]ublish.xml 142 | *.azurePubxml 143 | # TODO: Comment the next line if you want to checkin your web deploy settings 144 | # but database connection strings (with potential passwords) will be unencrypted 145 | *.pubxml 146 | *.publishproj 147 | 148 | # NuGet Packages 149 | *.nupkg 150 | # The packages folder can be ignored because of Package Restore 151 | **/packages/* 152 | # except build/, which is used as an MSBuild target. 153 | !**/packages/build/ 154 | # Uncomment if necessary however generally it will be regenerated when needed 155 | #!**/packages/repositories.config 156 | 157 | # Microsoft Azure Build Output 158 | csx/ 159 | *.build.csdef 160 | 161 | # Microsoft Azure Emulator 162 | ecf/ 163 | rcf/ 164 | 165 | # Microsoft Azure ApplicationInsights config file 166 | ApplicationInsights.config 167 | 168 | # Windows Store app package directory 169 | AppPackages/ 170 | BundleArtifacts/ 171 | 172 | # Visual Studio cache files 173 | # files ending in .cache can be ignored 174 | *.[Cc]ache 175 | # but keep track of directories ending in .cache 176 | !*.[Cc]ache/ 177 | 178 | # Others 179 | ClientBin/ 180 | ~$* 181 | *~ 182 | *.dbmdl 183 | *.dbproj.schemaview 184 | *.pfx 185 | *.publishsettings 186 | orleans.codegen.cs 187 | 188 | /node_modules 189 | 190 | # RIA/Silverlight projects 191 | Generated_Code/ 192 | 193 | # Backup & report files from converting an old project file 194 | # to a newer Visual Studio version. Backup files are not needed, 195 | # because we have git ;-) 196 | _UpgradeReport_Files/ 197 | Backup*/ 198 | UpgradeLog*.XML 199 | UpgradeLog*.htm 200 | 201 | # SQL Server files 202 | *.mdf 203 | *.ldf 204 | 205 | # Business Intelligence projects 206 | *.rdl.data 207 | *.bim.layout 208 | *.bim_*.settings 209 | 210 | # Microsoft Fakes 211 | FakesAssemblies/ 212 | 213 | # GhostDoc plugin setting file 214 | *.GhostDoc.xml 215 | 216 | # Node.js Tools for Visual Studio 217 | .ntvs_analysis.dat 218 | 219 | # Visual Studio 6 build log 220 | *.plg 221 | 222 | # Visual Studio 6 workspace options file 223 | *.opt 224 | 225 | # Visual Studio LightSwitch build output 226 | **/*.HTMLClient/GeneratedArtifacts 227 | **/*.DesktopClient/GeneratedArtifacts 228 | **/*.DesktopClient/ModelManifest.xml 229 | **/*.Server/GeneratedArtifacts 230 | **/*.Server/ModelManifest.xml 231 | _Pvt_Extensions 232 | 233 | # Paket dependency manager 234 | .paket/paket.exe 235 | 236 | # FAKE - F# Make 237 | .fake/ 238 | /wwwroot/index.html 239 | --------------------------------------------------------------------------------