Compare commits

..

53 Commits

Author SHA1 Message Date
Steve Sanderson
c0c47e3def Example of using BrowserAnimationsModule 2017-08-24 15:44:56 -07:00
Steve Sanderson
e5f1299239 Use devDependencies consistently in templates (no packages required in production, as webpack publish builds are standalone). Fixes #747 2017-08-24 15:31:34 -07:00
Steve Sanderson
c922eee1d6 Fix artifacts dir for test 2017-08-23 17:15:37 -07:00
Steve Sanderson
8b243e8cc7 Simplify build script further 2017-08-23 17:12:06 -07:00
Steve Sanderson
28920c7691 Simplify .gitignore 2017-08-23 16:57:43 -07:00
Steve Sanderson
412ec1b427 Build templates nupkgs directly from source without copying to staging location 2017-08-23 16:56:07 -07:00
Steve Sanderson
c62a3b491c Fix templates directory structure to produce correct nupkg output 2017-08-23 16:38:16 -07:00
Steve Sanderson
559832bb6d Remove dynamic content replacement from nuspec files 2017-08-23 15:41:09 -07:00
Steve Sanderson
45d645931b Remove template build dynamic filename replacement. Working towards eliminating template build process completely. 2017-08-23 15:27:15 -07:00
Steve Sanderson
8d6119f31d Remove the Yeoman-specific gitignore workaround 2017-08-23 15:04:04 -07:00
Steve Sanderson
0291686b20 Reorganize templates into dir structure matching 'dotnet new' templates 2017-08-23 14:58:49 -07:00
Steve Sanderson
7c52be5e42 Stop generating .template.config files dynamically. Convert them to plain files on disk. 2017-08-22 18:06:48 -07:00
Steve Sanderson
900e9ca835 Add deprecation notice to Yeoman package 2017-08-22 17:11:02 -07:00
Steve Sanderson
ad758b1060 Update AppVeyor config to remove Yeoman artifact reference 2017-08-22 16:20:25 -07:00
Steve Sanderson
cd9ad38a99 Run tests against 'dotnet new' output instead of Yeoman output 2017-08-22 16:13:34 -07:00
Steve Sanderson
e057cb35ec Remove Yeoman from the template build process 2017-08-22 14:43:51 -07:00
Steve Sanderson
eea2066a6d Remove Yeoman generator - replace it with deprecation notice. 2017-08-22 14:33:30 -07:00
Steve Sanderson
d6ae8829b6 In HMR, don't rely on default JsonSerializer settings. Fixes #688 2017-08-21 17:11:47 -07:00
Steve Sanderson
a94ac6f37e For Redux dev tools, use newer __REDUX_DEVTOOLS_EXTENSION__ API. Fixes #1196 2017-08-21 16:48:30 -07:00
Steve Sanderson
a40adab38d In non-ASP.NET apps, default project path to current working directory. Fixes #1100. 2017-08-21 16:40:59 -07:00
Stephan Troyer
c2a284d5b8 small Knockout cleanup 2017-08-21 16:17:10 -07:00
frederikprijck
fc398d602a Allow lazy loading with AngularSpa in dev build
Previously, the AngularSpa didn't include `angular2-router-loader`.
This commit ensures it does.

Closes #1194
2017-08-21 16:06:18 -07:00
Steve Sanderson
90c59ff4e7 Merge branch 'fix-angular-material-publishing' into dev 2017-08-21 15:53:19 -07:00
Steve Lathrop
a7e715c88f Small grammatical fix to README.md 2017-08-21 15:37:58 -07:00
alejandro garcia
6dddc9d01d Removed json loader from react redux template 2017-08-21 15:37:26 -07:00
Steve Sanderson
5ed1a35ce0 Fix problems with AoT when using Angular Material. Fixes #1168 2017-08-03 18:00:46 +01:00
Steve Sanderson
680ba7497a Merge branch 'rel/2.0.0-templates' into dev 2017-08-03 10:52:54 +01:00
John Luo
63f7ac9330 Ensure fallback to curl after failed wget 2017-08-02 14:32:21 -07:00
John Luo
d2858beaa1 Update __get_remote_file logic 2017-08-02 12:44:45 -07:00
Steve Sanderson
5f1450c9ba Make aspnet-angular compatible with AoT compilation 2017-08-02 10:53:46 +01:00
Steve Sanderson
c83605baff Add aspnet-angular NPM package containing HttpWithStateTransfer utility 2017-08-02 10:26:46 +01:00
Stephen Lautier
fc12d722b8 fix(webpack): fix middleware to specifically serialize options as non-camecased 2017-08-02 09:24:42 +01:00
Eric Green
372e597f34 Added Timeout to HttpClient to always be longer than the InvocationTimeoutMilliseconds.
HttpClient defaults to 100 seconds. If InvocationTimeoutMilliseconds is greater than the default of the HttpClient, the task will fail with a Task was canceled exception.
2017-08-02 09:22:34 +01:00
Charles Lowell
3715ec7c3f Fix typo 2017-08-02 09:21:40 +01:00
Steve Sanderson
d2eaa36372 Merge branch 'rel/2.0.0-templates' into dev 2017-07-27 15:09:17 +01:00
Nate McMaster
895a61160e Fix syntax warning when running build.sh on older versions of bash
[ci skip]
2017-07-26 10:27:55 -07:00
Nate McMaster
b8b769aa74 Update bootstrappers to use the compiled version of KoreBuild
[ci skip]
2017-07-25 16:32:52 -07:00
Pranav K
c4aad6bcab Updating to InternalAspNetCoreSdkVersion 2.1.1-* 2017-07-25 15:13:39 -07:00
Ryan Brandenburg
27f1d07d21 Set AspNetCoreVersion 2017-07-24 17:56:46 -07:00
Ryan Brandenburg
0cb14a3c68 2.0.0-rtm to 2.1.0-preview1 2017-07-24 12:31:10 -07:00
Steve Sanderson
2457b4ee5d Merge branch 'rel/2.0.0-templates' into dev 2017-07-19 14:26:12 +01:00
Mike Harder
a902874754 Remove unused variable AutoMapperVersion 2017-07-19 14:19:37 +01:00
Steve Sanderson
f43ea777eb Merge branch 'rel/2.0.0-templates' into dev 2017-07-13 16:17:19 +01:00
Steve Sanderson
d1198aeab2 Merge branch 'rel/2.0.0-templates' into dev 2017-07-13 10:14:31 +01:00
Steve Sanderson
a9ddf1413f Merge branch 'rel/2.0.0-templates' into dev 2017-07-12 23:31:33 +01:00
Steve Sanderson
a0a710a0df Merge pull request #1111 from aspnet/rel/2.0.0
Complete the lstat patching for #1101
2017-07-12 15:27:37 +01:00
Steve Sanderson
d5f5ad7fdc Merge branch 'rel/2.0.0-templates' into dev 2017-07-12 00:39:57 +01:00
Steve Sanderson
2df0febfba Merge branch 'rel/2.0.0-templates' into dev 2017-07-12 00:05:37 +01:00
Steve Sanderson
b434eefd83 Merge pull request #1108 from aspnet/rel/2.0.0
Fix webpack HMR proxying logic for apps running on non-root URLs (e.g…
2017-07-11 18:57:03 +01:00
Steve Sanderson
44360b6955 Merge pull request #1103 from aspnet/rel/2.0.0
Merge Rel/2.0.0 back to dev
2017-07-11 10:45:58 +01:00
Ryan Brandenburg
72b1e627b0 Skip first time experience on Appveyor 2017-07-10 15:22:22 -07:00
Pranav K
781c5dc37c Merge branch 'rel/2.0.0' into dev 2017-07-10 11:57:58 -07:00
Pranav K
c2f63f21fd Merge branch 'rel/2.0.0' into dev 2017-07-10 11:43:36 -07:00
259 changed files with 1643 additions and 952 deletions

11
.gitignore vendored
View File

@@ -29,14 +29,7 @@ nuget.exe
npm-debug.log npm-debug.log
/.build/ /.build/
# The templates can't contain their own .gitignore files, because Yeoman has strange default handling for
# files with that name (https://github.com/npm/npm/issues/1862). So, each template instead has a template_gitignore
# file which gets renamed after the files are copied. And so any files that need to be excluded in the source
# repo have to be excluded here.
/templates/*/node_modules/
/templates/*/wwwroot/dist/
/templates/*/ClientApp/dist/
/templates/*/yarn.lock
.vscode/ .vscode/
/templates/*/Properties/launchSettings.json global.json
korebuild-lock.txt

View File

@@ -2,7 +2,7 @@
<configuration> <configuration>
<packageSources> <packageSources>
<clear /> <clear />
<add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-ci-release/api/v3/index.json" /> <add key="AspNetCore" value="https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json" />
<add key="AspNetCoreTools" value="https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json" /> <add key="AspNetCoreTools" value="https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json" />
<add key="NuGet" value="https://api.nuget.org/v3/index.json" /> <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
</packageSources> </packageSources>

View File

@@ -1,4 +1,4 @@
init: init:
- git config --global core.autocrlf true - git config --global core.autocrlf true
install: install:
- ps: Install-Product node 6.9.2 x64 - ps: Install-Product node 6.9.2 x64
@@ -18,13 +18,15 @@ build_script:
- npm run build - npm run build
- ps: Pop-Location - ps: Pop-Location
artifacts: artifacts:
- path: templates\package-builder\dist\artifacts\generator-aspnetcore-spa.tar.gz - path: templates\package-builder\artifacts\*.nupkg
name: generator-aspnetcore-spa
- path: templates\package-builder\dist\artifacts\*.nupkg
name: Microsoft.AspNetCore.SpaTemplates name: Microsoft.AspNetCore.SpaTemplates
type: NuGetPackage type: NuGetPackage
# - ps: .\build.ps1 # - ps: .\build.ps1
clone_depth: 1 clone_depth: 1
environment:
global:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: 1
test_script: test_script:
- dotnet restore - dotnet restore
- ps: Push-Location - ps: Push-Location

222
build.ps1
View File

@@ -1,67 +1,177 @@
$ErrorActionPreference = "Stop" #!/usr/bin/env powershell
#requires -version 4
function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries) <#
{ .SYNOPSIS
while($true) Build this repository
{
try
{
Invoke-WebRequest $url -OutFile $downloadLocation
break
}
catch
{
$exceptionMessage = $_.Exception.Message
Write-Host "Failed to download '$url': $exceptionMessage"
if ($retries -gt 0) {
$retries--
Write-Host "Waiting 10 seconds before retrying. Retries left: $retries"
Start-Sleep -Seconds 10
} .DESCRIPTION
else Downloads korebuild if required. Then builds the repository.
{
$exception = $_.Exception .PARAMETER Path
throw $exception The folder to build. Defaults to the folder containing this script.
}
} .PARAMETER Channel
} The channel of KoreBuild to download. Overrides the value from the config file.
.PARAMETER DotNetHome
The directory where .NET Core tools will be stored.
.PARAMETER ToolsSource
The base url where build tools can be downloaded. Overrides the value from the config file.
.PARAMETER Update
Updates KoreBuild to the latest version even if a lock file is present.
.PARAMETER ConfigFile
The path to the configuration file that stores values. Defaults to version.xml.
.PARAMETER MSBuildArgs
Arguments to be passed to MSBuild
.NOTES
This function will create a file $PSScriptRoot/korebuild-lock.txt. This lock file can be committed to source, but does not have to be.
When the lockfile is not present, KoreBuild will create one using latest available version from $Channel.
The $ConfigFile is expected to be an XML file. It is optional, and the configuration values in it are optional as well.
.EXAMPLE
Example config file:
```xml
<!-- version.xml -->
<Project>
<PropertyGroup>
<KoreBuildChannel>dev</KoreBuildChannel>
<KoreBuildToolsSource>https://aspnetcore.blob.core.windows.net/buildtools</KoreBuildToolsSource>
</PropertyGroup>
</Project>
```
#>
[CmdletBinding(PositionalBinding = $false)]
param(
[string]$Path = $PSScriptRoot,
[Alias('c')]
[string]$Channel,
[Alias('d')]
[string]$DotNetHome,
[Alias('s')]
[string]$ToolsSource,
[Alias('u')]
[switch]$Update,
[string]$ConfigFile = (Join-Path $PSScriptRoot 'version.xml'),
[Parameter(ValueFromRemainingArguments = $true)]
[string[]]$MSBuildArgs
)
Set-StrictMode -Version 2
$ErrorActionPreference = 'Stop'
#
# Functions
#
function Get-KoreBuild {
$lockFile = Join-Path $Path 'korebuild-lock.txt'
if (!(Test-Path $lockFile) -or $Update) {
Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile
} }
cd $PSScriptRoot $version = Get-Content $lockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1
if (!$version) {
$repoFolder = $PSScriptRoot Write-Error "Failed to parse version from $lockFile. Expected a line that begins with 'version:'"
$env:REPO_FOLDER = $repoFolder
$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0.zip"
if ($env:KOREBUILD_ZIP)
{
$koreBuildZip=$env:KOREBUILD_ZIP
} }
$version = $version.TrimStart('version:').Trim()
$korebuildPath = Join-Paths $DotNetHome ('buildtools', 'korebuild', $version)
$buildFolder = ".build" if (!(Test-Path $korebuildPath)) {
$buildFile="$buildFolder\KoreBuild.ps1" Write-Host -ForegroundColor Magenta "Downloading KoreBuild $version"
New-Item -ItemType Directory -Path $korebuildPath | Out-Null
if (!(Test-Path $buildFolder)) { $remotePath = "$ToolsSource/korebuild/artifacts/$version/korebuild.$version.zip"
Write-Host "Downloading KoreBuild from $koreBuildZip"
$tempFolder=$env:TEMP + "\KoreBuild-" + [guid]::NewGuid()
New-Item -Path "$tempFolder" -Type directory | Out-Null
$localZipFile="$tempFolder\korebuild.zip"
DownloadWithRetry -url $koreBuildZip -downloadLocation $localZipFile -retries 6
try {
$tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip"
Get-RemoteFile $remotePath $tmpfile
if (Get-Command -Name 'Expand-Archive' -ErrorAction Ignore) {
# Use built-in commands where possible as they are cross-plat compatible
Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath
}
else {
# Fallback to old approach for old installations of PowerShell
Add-Type -AssemblyName System.IO.Compression.FileSystem Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder) [System.IO.Compression.ZipFile]::ExtractToDirectory($tmpfile, $korebuildPath)
}
New-Item -Path "$buildFolder" -Type directory | Out-Null }
copy-item "$tempFolder\**\build\*" $buildFolder -Recurse catch {
Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore
# Cleanup throw
if (Test-Path $tempFolder) { }
Remove-Item -Recurse -Force $tempFolder finally {
Remove-Item $tmpfile -ErrorAction Ignore
} }
} }
&"$buildFile" @args return $korebuildPath
}
function Join-Paths([string]$path, [string[]]$childPaths) {
$childPaths | ForEach-Object { $path = Join-Path $path $_ }
return $path
}
function Get-RemoteFile([string]$RemotePath, [string]$LocalPath) {
if ($RemotePath -notlike 'http*') {
Copy-Item $RemotePath $LocalPath
return
}
$retries = 10
while ($retries -gt 0) {
$retries -= 1
try {
Invoke-WebRequest -UseBasicParsing -Uri $RemotePath -OutFile $LocalPath
return
}
catch {
Write-Verbose "Request failed. $retries retries remaining"
}
}
Write-Error "Download failed: '$RemotePath'."
}
#
# Main
#
# Load configuration or set defaults
if (Test-Path $ConfigFile) {
[xml] $config = Get-Content $ConfigFile
if (!($Channel)) { [string] $Channel = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildChannel' }
if (!($ToolsSource)) { [string] $ToolsSource = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildToolsSource' }
}
if (!$DotNetHome) {
$DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } `
elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} `
elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}`
else { Join-Path $PSScriptRoot '.dotnet'}
}
if (!$Channel) { $Channel = 'dev' }
if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' }
# Execute
$korebuildPath = Get-KoreBuild
Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1')
try {
Install-Tools $ToolsSource $DotNetHome
Invoke-RepositoryBuild $Path @MSBuildArgs
}
finally {
Remove-Module 'KoreBuild' -ErrorAction Ignore
}

227
build.sh
View File

@@ -1,46 +1,199 @@
#!/usr/bin/env bash #!/usr/bin/env bash
repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $repoFolder
koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0.zip" set -euo pipefail
if [ ! -z $KOREBUILD_ZIP ]; then
koreBuildZip=$KOREBUILD_ZIP #
# variables
#
RESET="\033[0m"
RED="\033[0;31m"
MAGENTA="\033[0;95m"
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet"
config_file="$DIR/version.xml"
verbose=false
update=false
repo_path="$DIR"
channel=''
tools_source=''
#
# Functions
#
__usage() {
echo "Usage: $(basename "${BASH_SOURCE[0]}") [options] [[--] <MSBUILD_ARG>...]"
echo ""
echo "Arguments:"
echo " <MSBUILD_ARG>... Arguments passed to MSBuild. Variable number of arguments allowed."
echo ""
echo "Options:"
echo " --verbose Show verbose output."
echo " -c|--channel <CHANNEL> The channel of KoreBuild to download. Overrides the value from the config file.."
echo " --config-file <FILE> TThe path to the configuration file that stores values. Defaults to version.xml."
echo " -d|--dotnet-home <DIR> The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet."
echo " --path <PATH> The directory to build. Defaults to the directory containing the script."
echo " -s|--tools-source <URL> The base url where build tools can be downloaded. Overrides the value from the config file."
echo " -u|--update Update to the latest KoreBuild even if the lock file is present."
echo ""
echo "Description:"
echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be."
echo " When the lockfile is not present, KoreBuild will create one using latest available version from \$channel."
if [[ "${1:-}" != '--no-exit' ]]; then
exit 2
fi
}
get_korebuild() {
local version
local lock_file="$repo_path/korebuild-lock.txt"
if [ ! -f "$lock_file" ] || [ "$update" = true ]; then
__get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file"
fi
version="$(grep 'version:*' -m 1 "$lock_file")"
if [[ "$version" == '' ]]; then
__error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'"
return 1
fi
version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version"
{
if [ ! -d "$korebuild_path" ]; then
mkdir -p "$korebuild_path"
local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip"
tmpfile="$(mktemp)"
echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}"
if __get_remote_file "$remote_path" "$tmpfile"; then
unzip -q -d "$korebuild_path" "$tmpfile"
fi
rm "$tmpfile" || true
fi fi
buildFolder=".build" source "$korebuild_path/KoreBuild.sh"
buildFile="$buildFolder/KoreBuild.sh" } || {
if [ -d "$korebuild_path" ]; then
if test ! -d $buildFolder; then echo "Cleaning up after failed installation"
echo "Downloading KoreBuild from $koreBuildZip" rm -rf "$korebuild_path" || true
tempFolder="/tmp/KoreBuild-$(uuidgen)"
mkdir $tempFolder
localZipFile="$tempFolder/korebuild.zip"
retries=6
until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null)
do
echo "Failed to download '$koreBuildZip'"
if [ "$retries" -le 0 ]; then
exit 1
fi fi
retries=$((retries - 1)) return 1
echo "Waiting 10 seconds before retrying. Retries left: $retries" }
sleep 10s }
__error() {
echo -e "${RED}$*${RESET}" 1>&2
}
__machine_has() {
hash "$1" > /dev/null 2>&1
return $?
}
__get_remote_file() {
local remote_path=$1
local local_path=$2
if [[ "$remote_path" != 'http'* ]]; then
cp "$remote_path" "$local_path"
return 0
fi
local failed=false
if __machine_has wget; then
wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true
else
failed=true
fi
if [ "$failed" = true ] && __machine_has curl; then
failed=false
curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true
fi
if [ "$failed" = true ]; then
__error "Download failed: $remote_path" 1>&2
return 1
fi
}
__read_dom () { local IFS=\> ; read -r -d \< ENTITY CONTENT ;}
#
# main
#
while [[ $# -gt 0 ]]; do
case $1 in
-\?|-h|--help)
__usage --no-exit
exit 0
;;
-c|--channel|-Channel)
shift
channel="${1:-}"
[ -z "$channel" ] && __usage
;;
--config-file|-ConfigFile)
shift
config_file="${1:-}"
[ -z "$config_file" ] && __usage
;;
-d|--dotnet-home|-DotNetHome)
shift
DOTNET_HOME="${1:-}"
[ -z "$DOTNET_HOME" ] && __usage
;;
--path|-Path)
shift
repo_path="${1:-}"
[ -z "$repo_path" ] && __usage
;;
-s|--tools-source|-ToolsSource)
shift
tools_source="${1:-}"
[ -z "$tools_source" ] && __usage
;;
-u|--update|-Update)
update=true
;;
--verbose|-Verbose)
verbose=true
;;
--)
shift
break
;;
*)
break
;;
esac
shift
done done
unzip -q -d $tempFolder $localZipFile if ! __machine_has unzip; then
__error 'Missing required command: unzip'
mkdir $buildFolder exit 1
cp -r $tempFolder/**/build/** $buildFolder
chmod +x $buildFile
# Cleanup
if test -d $tempFolder; then
rm -rf $tempFolder
fi
fi fi
$buildFile -r $repoFolder "$@" if ! __machine_has curl && ! __machine_has wget; then
__error 'Missing required command. Either wget or curl is required.'
exit 1
fi
if [ -f "$config_file" ]; then
comment=false
while __read_dom; do
if [ "$comment" = true ]; then [[ $CONTENT == *'-->'* ]] && comment=false ; continue; fi
if [[ $ENTITY == '!--'* ]]; then comment=true; continue; fi
if [ -z "$channel" ] && [[ $ENTITY == "KoreBuildChannel" ]]; then channel=$CONTENT; fi
if [ -z "$tools_source" ] && [[ $ENTITY == "KoreBuildToolsSource" ]]; then tools_source=$CONTENT; fi
done < "$config_file"
fi
[ -z "$channel" ] && channel='dev'
[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools'
get_korebuild
install_tools "$tools_source" "$DOTNET_HOME"
invoke_repository_build "$repo_path" "$@"

View File

@@ -1,6 +1,6 @@
<Project> <Project>
<Import Project="dependencies.props" /> <Import Project="dependencies.props" />
<Import Project="..\version.props" /> <Import Project="..\version.xml" />
<PropertyGroup> <PropertyGroup>
<Product>Microsoft ASP.NET Core</Product> <Product>Microsoft ASP.NET Core</Product>

View File

@@ -1,8 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<AspNetCoreVersion>2.0.0-*</AspNetCoreVersion> <AspNetCoreVersion>2.1.0-*</AspNetCoreVersion>
<AutoMapperVersion>5.0.2</AutoMapperVersion> <InternalAspNetCoreSdkVersion>2.1.1-*</InternalAspNetCoreSdkVersion>
<InternalAspNetCoreSdkVersion>2.0.1-*</InternalAspNetCoreSdkVersion>
<JsonNetVersion>10.0.1</JsonNetVersion> <JsonNetVersion>10.0.1</JsonNetVersion>
<NETStandardImplicitPackageVersion>2.0.0-*</NETStandardImplicitPackageVersion> <NETStandardImplicitPackageVersion>2.0.0-*</NETStandardImplicitPackageVersion>
<NETStandardLibraryNETFrameworkVersion>2.0.0-*</NETStandardLibraryNETFrameworkVersion> <NETStandardLibraryNETFrameworkVersion>2.0.0-*</NETStandardLibraryNETFrameworkVersion>

View File

@@ -21,7 +21,6 @@ namespace ConsoleApplication
// Since .NET Core 1.1, the HTTP hosting model has become basically as fast as the Socket hosting model // Since .NET Core 1.1, the HTTP hosting model has become basically as fast as the Socket hosting model
//options.UseSocketHosting(); //options.UseSocketHosting();
options.ProjectPath = Directory.GetCurrentDirectory();
options.WatchFileExtensions = new string[] {}; // Don't watch anything options.WatchFileExtensions = new string[] {}; // Don't watch anything
}); });
var serviceProvider = services.BuildServiceProvider(); var serviceProvider = services.BuildServiceProvider();

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Threading; using System.Threading;
using Microsoft.AspNetCore.NodeServices.HostingModels; using Microsoft.AspNetCore.NodeServices.HostingModels;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@@ -34,14 +35,18 @@ namespace Microsoft.AspNetCore.NodeServices
InvocationTimeoutMilliseconds = DefaultInvocationTimeoutMilliseconds; InvocationTimeoutMilliseconds = DefaultInvocationTimeoutMilliseconds;
WatchFileExtensions = (string[])DefaultWatchFileExtensions.Clone(); WatchFileExtensions = (string[])DefaultWatchFileExtensions.Clone();
// In an ASP.NET environment, we can use the IHostingEnvironment data to auto-populate a few
// things that you'd otherwise have to specify manually
var hostEnv = serviceProvider.GetService<IHostingEnvironment>(); var hostEnv = serviceProvider.GetService<IHostingEnvironment>();
if (hostEnv != null) if (hostEnv != null)
{ {
// In an ASP.NET environment, we can use the IHostingEnvironment data to auto-populate a few
// things that you'd otherwise have to specify manually
ProjectPath = hostEnv.ContentRootPath; ProjectPath = hostEnv.ContentRootPath;
EnvironmentVariables["NODE_ENV"] = hostEnv.IsDevelopment() ? "development" : "production"; // De-facto standard values for Node EnvironmentVariables["NODE_ENV"] = hostEnv.IsDevelopment() ? "development" : "production"; // De-facto standard values for Node
} }
else
{
ProjectPath = Directory.GetCurrentDirectory();
}
var applicationLifetime = serviceProvider.GetService<IApplicationLifetime>(); var applicationLifetime = serviceProvider.GetService<IApplicationLifetime>();
if (applicationLifetime != null) if (applicationLifetime != null)

View File

@@ -50,6 +50,7 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
options.DebuggingPort) options.DebuggingPort)
{ {
_client = new HttpClient(); _client = new HttpClient();
_client.Timeout = TimeSpan.FromMilliseconds(options.InvocationTimeoutMilliseconds + 1000);
} }
private static string MakeCommandLineOptions(int port) private static string MakeCommandLineOptions(int port)

View File

@@ -317,7 +317,7 @@ module.exports = {
## Hosting models ## Hosting models
NodeServices has a pluggable hosting/transport mechanism, because it is an abstraction over various possible ways to invoke Node.js from .NET. This allows more high-level facilities (e.g., for Angular prerendering) to be agnostic to the details of launching Node and communicating it - those high-level facilities can just trust that *somehow* we can invoke code in Node for them. NodeServices has a pluggable hosting/transport mechanism, because it is an abstraction over various possible ways to invoke Node.js from .NET. This allows more high-level facilities (e.g., for Angular prerendering) to be agnostic to the details of launching Node and communicating with it - those high-level facilities can just trust that *somehow* we can invoke code in Node for them.
Using this abstraction, we could run Node inside the .NET process, in a separate process on the same machine, or even on a different machine altogether. At the time of writing, all the built-in hosting mechanisms work by launching Node as a separate process on the same machine as your .NET code. Using this abstraction, we could run Node inside the .NET process, in a separate process on the same machine, or even on a different machine altogether. At the time of writing, all the built-in hosting mechanisms work by launching Node as a separate process on the same machine as your .NET code.

View File

@@ -4,6 +4,7 @@ using System.Threading;
using Microsoft.AspNetCore.NodeServices; using Microsoft.AspNetCore.NodeServices;
using Microsoft.AspNetCore.SpaServices.Webpack; using Microsoft.AspNetCore.SpaServices.Webpack;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
namespace Microsoft.AspNetCore.Builder namespace Microsoft.AspNetCore.Builder
{ {
@@ -14,6 +15,12 @@ namespace Microsoft.AspNetCore.Builder
{ {
private const string DefaultConfigFile = "webpack.config.js"; private const string DefaultConfigFile = "webpack.config.js";
private static readonly JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
TypeNameHandling = TypeNameHandling.None
};
/// <summary> /// <summary>
/// Enables Webpack dev middleware support. This hosts an instance of the Webpack compiler in memory /// Enables Webpack dev middleware support. This hosts an instance of the Webpack compiler in memory
/// in your application so that you can always serve up-to-date Webpack-built resources without having /// in your application so that you can always serve up-to-date Webpack-built resources without having
@@ -87,7 +94,7 @@ namespace Microsoft.AspNetCore.Builder
}; };
var devServerInfo = var devServerInfo =
nodeServices.InvokeExportAsync<WebpackDevServerInfo>(nodeScript.FileName, "createWebpackDevServer", nodeServices.InvokeExportAsync<WebpackDevServerInfo>(nodeScript.FileName, "createWebpackDevServer",
JsonConvert.SerializeObject(devServerOptions)).Result; JsonConvert.SerializeObject(devServerOptions, jsonSerializerSettings)).Result;
// If we're talking to an older version of aspnet-webpack, it will return only a single PublicPath, // If we're talking to an older version of aspnet-webpack, it will return only a single PublicPath,
// not an array of PublicPaths. Handle that scenario. // not an array of PublicPaths. Handle that scenario.

View File

@@ -0,0 +1,5 @@
/node_modules/
**/*.js
**/*.d.ts
**/*.metadata.json
/compiled

View File

@@ -0,0 +1,3 @@
!/*.js
!/*.d.ts
/compiled

View File

@@ -0,0 +1,12 @@
Copyright (c) .NET Foundation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
these files except in compliance with the License. You may obtain a copy of the
License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

View File

@@ -0,0 +1,33 @@
{
"name": "aspnet-angular",
"version": "0.1.1",
"description": "Helpers for using Angular in ASP.NET Core projects",
"main": "index.js",
"scripts": {
"prepublish": "rimraf *.d.ts && ngc && echo 'Finished building NPM package \"aspnet-angular\"'",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/aspnet/JavaScriptServices.git"
},
"author": "Microsoft",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/aspnet/JavaScriptServices/issues"
},
"devDependencies": {
"@angular/common": "^4.3.2",
"@angular/compiler": "^4.3.2",
"@angular/compiler-cli": "^4.3.2",
"@angular/core": "^4.3.2",
"@angular/http": "^4.3.2",
"@angular/platform-browser": "^4.3.2",
"rimraf": "^2.6.1",
"rxjs": "^5.4.2",
"zone.js": "^0.8.16"
},
"peerDependencies": {
"@angular/core": "^4.2.5 || ^5.0.0-beta"
}
}

View File

@@ -0,0 +1,94 @@
import { Provider, NgModule, Inject } from '@angular/core';
import { Headers, Http, ResponseOptions, RequestOptionsArgs, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';
const globalSerializedStateKey = 'HTTP_STATE_TRANSFER';
const backingStoreDIToken = 'HTTP_STATE_BACKING_STORE';
export interface CacheOptions {
permanent: boolean;
}
export interface CachedHttpResponse {
headers: { [name: string]: any } | null;
status: number;
statusText: string | null;
text: string;
url: string;
}
export type BackingStore = { [key: string]: CachedHttpResponse };
export class HttpWithStateTransfer {
private backingStore: BackingStore;
private http: Http;
constructor(@Inject(Http) http: Http, @Inject(backingStoreDIToken) backingStore: BackingStore) {
this.http = http;
this.backingStore = backingStore;
}
public stateForTransfer(): any {
return { [globalSerializedStateKey]: this.backingStore };
}
public get(url: string, options?: CacheOptions, requestOptions?: RequestOptionsArgs): Observable<Response> {
return this.getCachedResponse(/* cacheKey */ url, () => this.http.get(url, requestOptions), options);
}
private getCachedResponse(cacheKey: string, provider: () => Observable<Response>, options?: CacheOptions): Observable<Response> {
// By default, the cache is only used for the *first* client-side read. So, we're only performing
// a one-time transfer of server-side response to the client. If you want to keep and reuse cached
// responses continually during server-side and client-side execution, set 'permanent' to 'true.
const isClient = typeof window !== 'undefined';
const isPermanent = options && options.permanent;
const allowReadFromCache = isClient || isPermanent;
if (allowReadFromCache && this.backingStore.hasOwnProperty(cacheKey)) {
const cachedValue = this.backingStore[cacheKey];
if (!isPermanent) {
delete this.backingStore[cacheKey];
}
return Observable.of(new Response(new ResponseOptions({
body: cachedValue.text,
headers: new Headers(cachedValue.headers),
status: cachedValue.status,
url: cachedValue.url
})));
}
return provider()
.map(response => {
const allowWriteToCache = !isClient || isPermanent;
if (allowWriteToCache) {
this.backingStore[cacheKey] = {
headers: response.headers ? response.headers.toJSON() : null,
status: response.status,
statusText: response.statusText,
text: response.text(),
url: response.url
};
}
return response;
});
}
}
export function defaultBackingStoreFactory() {
const transferredData = typeof window !== 'undefined' ? (window as any)[globalSerializedStateKey] : null;
return transferredData || {};
}
@NgModule({
providers: [
// The backing store is a separate DI service so you could override exactly how it gets
// transferred from server to client
{ provide: backingStoreDIToken, useFactory: defaultBackingStoreFactory },
{ provide: HttpWithStateTransfer, useClass: HttpWithStateTransfer },
]
})
export class HttpWithStateTransferModule {
}

View File

@@ -0,0 +1 @@
export * from './HttpWithStateTransfer';

View File

@@ -0,0 +1,20 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"moduleResolution": "node",
"module": "commonjs",
"target": "es5",
"declaration": true,
"outDir": ".",
"lib": ["es2015", "dom"]
},
"files": [
"src/index.ts"
],
"exclude": [
"node_modules"
],
"angularCompilerOptions": {
"genDir": "compiled"
}
}

View File

@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata> <metadata>
<id>Microsoft.AspNetCore.SpaTemplates</id> <id>Microsoft.AspNetCore.SpaTemplates</id>
<version>{yeomanversion}</version> <version>0.0.0</version>
<description>Single Page Application templates for ASP.NET Core</description> <description>Single Page Application templates for ASP.NET Core</description>
<authors>Microsoft</authors> <authors>Microsoft</authors>
<language>en-US</language> <language>en-US</language>
@@ -14,4 +14,10 @@
<packageType name="Template" /> <packageType name="Template" />
</packageTypes> </packageTypes>
</metadata> </metadata>
<files>
<file
src="**/*"
exclude="*/node_modules/**;*/bin/**;*/obj/**;*/ClientApp/dist/**;*/wwwroot/dist/**"
target="Content" />
</files>
</package> </package>

View File

@@ -0,0 +1,17 @@
{
"$schema": "http://json.schemastore.org/dotnetcli.host",
"symbolInfo": {
"TargetFrameworkOverride": {
"isHidden": "true",
"longName": "target-framework-override",
"shortName": ""
},
"Framework": {
"longName": "framework"
},
"skipRestore": {
"longName": "no-restore",
"shortName": ""
}
}
}

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,87 @@
{
"author": "Microsoft",
"classifications": [
"Web",
"MVC",
"SPA"
],
"groupIdentity": "Microsoft.AspNetCore.SpaTemplates.Aurelia",
"identity": "Microsoft.AspNetCore.SpaTemplates.Aurelia.CSharp",
"name": "ASP.NET Core with Aurelia",
"preferNameDirectory": true,
"primaryOutputs": [
{
"path": "AureliaSpa.csproj"
}
],
"shortName": "aurelia",
"sourceName": "AureliaSpa",
"sources": [
{
"source": "./",
"target": "./",
"exclude": [
".template.config/**"
]
}
],
"symbols": {
"TargetFrameworkOverride": {
"type": "parameter",
"description": "Overrides the target framework",
"replaces": "TargetFrameworkOverride",
"datatype": "string",
"defaultValue": ""
},
"Framework": {
"type": "parameter",
"description": "The target framework for the project.",
"datatype": "choice",
"choices": [
{
"choice": "netcoreapp2.0",
"description": "Target netcoreapp2.0"
}
],
"replaces": "netcoreapp2.0",
"defaultValue": "netcoreapp2.0"
},
"HostIdentifier": {
"type": "bind",
"binding": "HostIdentifier"
},
"skipRestore": {
"type": "parameter",
"datatype": "bool",
"description": "If specified, skips the automatic restore of the project on create.",
"defaultValue": "false"
}
},
"tags": {
"language": "C#",
"type": "project"
},
"postActions": [
{
"condition": "(!skipRestore)",
"description": "Restore NuGet packages required by this project.",
"manualInstructions": [
{
"text": "Run 'dotnet restore'"
}
],
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
"continueOnError": true
},
{
"condition": "(HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\")",
"actionId": "AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C",
"description": "\n\n-------------------------------------------------------------------\nIMPORTANT: Before running this project on the command line,\n you must restore NPM packages by running \"npm install\"\n-------------------------------------------------------------------\n",
"manualInstructions": [
{
"text": "Run \"npm install\""
}
]
}
]
}

View File

@@ -0,0 +1,20 @@
{
"$schema": "http://json.schemastore.org/vs-2017.3.host",
"name": {
"text": "Aurelia",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1200"
},
"description": {
"text": "A project template for creating an ASP.NET Core application with Aurelia",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1201"
},
"order": 301,
"icon": "icon.png",
"learnMoreLink": "https://github.com/aspnet/JavaScriptServices",
"uiFilters": [
"oneaspnet"
],
"minFullFrameworkVersion": "4.6.1"
}

View File

@@ -9,7 +9,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand" href="#/home">WebApplicationBasic</a> <a class="navbar-brand" href="#/home">AureliaSpa</a>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
<div class="navbar-collapse collapse"> <div class="navbar-collapse collapse">

View File

@@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace WebApplicationBasic.Controllers namespace AureliaSpa.Controllers
{ {
public class HomeController : Controller public class HomeController : Controller
{ {

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace WebApplicationBasic.Controllers namespace AureliaSpa.Controllers
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
public class SampleDataController : Controller public class SampleDataController : Controller

View File

@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace WebApplicationBasic namespace AureliaSpa
{ {
public class Program public class Program
{ {

View File

@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace WebApplicationBasic namespace AureliaSpa
{ {
public class Startup public class Startup
{ {

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebApplicationBasic</title> <title>@ViewData["Title"] - AureliaSpa</title>
<base href="~/" /> <base href="~/" />
<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" /> <link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />

View File

@@ -1,3 +1,3 @@
@using WebApplicationBasic @using AureliaSpa
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Microsoft.AspNetCore.SpaServices @addTagHelper *, Microsoft.AspNetCore.SpaServices

View File

@@ -1,5 +1,5 @@
{ {
"name": "WebApplicationBasic", "name": "AureliaSpa",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@types/webpack-env": { "@types/webpack-env": {

View File

@@ -1,26 +1,24 @@
{ {
"name": "WebApplicationBasic", "name": "AureliaSpa",
"private": true, "private": true,
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "devDependencies": {
"@types/webpack-env": "^1.13.0",
"aspnet-webpack": "^2.0.1",
"aurelia-bootstrapper": "^2.0.1", "aurelia-bootstrapper": "^2.0.1",
"aurelia-fetch-client": "^1.0.1", "aurelia-fetch-client": "^1.0.1",
"aurelia-framework": "^1.1.0", "aurelia-framework": "^1.1.0",
"aurelia-loader-webpack": "^2.0.0", "aurelia-loader-webpack": "^2.0.0",
"aurelia-pal": "^1.3.0", "aurelia-pal": "^1.3.0",
"aurelia-router": "^1.2.1", "aurelia-router": "^1.2.1",
"bootstrap": "^3.3.7",
"isomorphic-fetch": "^2.2.1",
"jquery": "^3.2.1"
},
"devDependencies": {
"@types/webpack-env": "^1.13.0",
"aspnet-webpack": "^2.0.1",
"aurelia-webpack-plugin": "^2.0.0-rc.2", "aurelia-webpack-plugin": "^2.0.0-rc.2",
"bootstrap": "^3.3.7",
"css-loader": "^0.28.0", "css-loader": "^0.28.0",
"extract-text-webpack-plugin": "^2.1.0", "extract-text-webpack-plugin": "^2.1.0",
"file-loader": "^0.11.1", "file-loader": "^0.11.1",
"html-loader": "^0.4.5", "html-loader": "^0.4.5",
"isomorphic-fetch": "^2.2.1",
"jquery": "^3.2.1",
"json-loader": "^0.5.4", "json-loader": "^0.5.4",
"style-loader": "^0.16.1", "style-loader": "^0.16.1",
"ts-loader": "^2.0.3", "ts-loader": "^2.0.3",

View File

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

@@ -0,0 +1,17 @@
{
"$schema": "http://json.schemastore.org/dotnetcli.host",
"symbolInfo": {
"TargetFrameworkOverride": {
"isHidden": "true",
"longName": "target-framework-override",
"shortName": ""
},
"Framework": {
"longName": "framework"
},
"skipRestore": {
"longName": "no-restore",
"shortName": ""
}
}
}

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -0,0 +1,87 @@
{
"author": "Microsoft",
"classifications": [
"Web",
"MVC",
"SPA"
],
"groupIdentity": "Microsoft.AspNetCore.SpaTemplates.Knockout",
"identity": "Microsoft.AspNetCore.SpaTemplates.Knockout.CSharp",
"name": "ASP.NET Core with Knockout.js",
"preferNameDirectory": true,
"primaryOutputs": [
{
"path": "KnockoutSpa.csproj"
}
],
"shortName": "knockout",
"sourceName": "KnockoutSpa",
"sources": [
{
"source": "./",
"target": "./",
"exclude": [
".template.config/**"
]
}
],
"symbols": {
"TargetFrameworkOverride": {
"type": "parameter",
"description": "Overrides the target framework",
"replaces": "TargetFrameworkOverride",
"datatype": "string",
"defaultValue": ""
},
"Framework": {
"type": "parameter",
"description": "The target framework for the project.",
"datatype": "choice",
"choices": [
{
"choice": "netcoreapp2.0",
"description": "Target netcoreapp2.0"
}
],
"replaces": "netcoreapp2.0",
"defaultValue": "netcoreapp2.0"
},
"HostIdentifier": {
"type": "bind",
"binding": "HostIdentifier"
},
"skipRestore": {
"type": "parameter",
"datatype": "bool",
"description": "If specified, skips the automatic restore of the project on create.",
"defaultValue": "false"
}
},
"tags": {
"language": "C#",
"type": "project"
},
"postActions": [
{
"condition": "(!skipRestore)",
"description": "Restore NuGet packages required by this project.",
"manualInstructions": [
{
"text": "Run 'dotnet restore'"
}
],
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
"continueOnError": true
},
{
"condition": "(HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\")",
"actionId": "AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C",
"description": "\n\n-------------------------------------------------------------------\nIMPORTANT: Before running this project on the command line,\n you must restore NPM packages by running \"npm install\"\n-------------------------------------------------------------------\n",
"manualInstructions": [
{
"text": "Run \"npm install\""
}
]
}
]
}

View File

@@ -0,0 +1,20 @@
{
"$schema": "http://json.schemastore.org/vs-2017.3.host",
"name": {
"text": "Knockout.js",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1300"
},
"description": {
"text": "A project template for creating an ASP.NET Core application with Knockout.js",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1301"
},
"order": 301,
"icon": "icon.png",
"learnMoreLink": "https://github.com/aspnet/JavaScriptServices",
"uiFilters": [
"oneaspnet"
],
"minFullFrameworkVersion": "4.6.1"
}

View File

@@ -7,7 +7,7 @@
<span class='icon-bar'></span> <span class='icon-bar'></span>
<span class='icon-bar'></span> <span class='icon-bar'></span>
</button> </button>
<a class='navbar-brand' href='/'>WebApplicationBasic</a> <a class='navbar-brand' href='/'>KnockoutSpa</a>
</div> </div>
<div class='clearfix'></div> <div class='clearfix'></div>
<div class='navbar-collapse collapse'> <div class='navbar-collapse collapse'>

View File

@@ -43,8 +43,7 @@ export class Router {
$(document).on('click', 'a', this.clickEventListener); $(document).on('click', 'a', this.clickEventListener);
// Initialize Crossroads with starting location // Initialize Crossroads with starting location
// Need to cast history to 'any' because @types/history is out-of-date crossroads.parse(history.location.pathname);
crossroads.parse((history as any).location.pathname);
} }
public link(url: string): string { public link(url: string): string {

View File

@@ -5,7 +5,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace WebApplicationBasic.Controllers namespace KnockoutSpa.Controllers
{ {
public class HomeController : Controller public class HomeController : Controller
{ {

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace WebApplicationBasic.Controllers namespace KnockoutSpa.Controllers
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
public class SampleDataController : Controller public class SampleDataController : Controller

View File

@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace WebApplicationBasic namespace KnockoutSpa
{ {
public class Program public class Program
{ {

View File

@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace WebApplicationBasic namespace KnockoutSpa
{ {
public class Startup public class Startup
{ {

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebApplicationBasic</title> <title>@ViewData["Title"] - KnockoutSpa</title>
<base href="~/" /> <base href="~/" />
<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" /> <link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />

View File

@@ -1,3 +1,3 @@
@using WebApplicationBasic @using KnockoutSpa
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Microsoft.AspNetCore.SpaServices @addTagHelper *, Microsoft.AspNetCore.SpaServices

View File

@@ -1,5 +1,5 @@
{ {
"name": "WebApplicationBasic", "name": "KnockoutSpa",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@types/core-js": { "@types/core-js": {

View File

@@ -1,5 +1,5 @@
{ {
"name": "WebApplicationBasic", "name": "KnockoutSpa",
"private": true, "private": true,
"version": "0.0.0", "version": "0.0.0",
"devDependencies": { "devDependencies": {

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,17 @@
{
"$schema": "http://json.schemastore.org/dotnetcli.host",
"symbolInfo": {
"TargetFrameworkOverride": {
"isHidden": "true",
"longName": "target-framework-override",
"shortName": ""
},
"Framework": {
"longName": "framework"
},
"skipRestore": {
"longName": "no-restore",
"shortName": ""
}
}
}

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,87 @@
{
"author": "Microsoft",
"classifications": [
"Web",
"MVC",
"SPA"
],
"groupIdentity": "Microsoft.AspNetCore.SpaTemplates.Vue",
"identity": "Microsoft.AspNetCore.SpaTemplates.Vue.CSharp",
"name": "ASP.NET Core with Vue.js",
"preferNameDirectory": true,
"primaryOutputs": [
{
"path": "VueSpa.csproj"
}
],
"shortName": "vue",
"sourceName": "VueSpa",
"sources": [
{
"source": "./",
"target": "./",
"exclude": [
".template.config/**"
]
}
],
"symbols": {
"TargetFrameworkOverride": {
"type": "parameter",
"description": "Overrides the target framework",
"replaces": "TargetFrameworkOverride",
"datatype": "string",
"defaultValue": ""
},
"Framework": {
"type": "parameter",
"description": "The target framework for the project.",
"datatype": "choice",
"choices": [
{
"choice": "netcoreapp2.0",
"description": "Target netcoreapp2.0"
}
],
"replaces": "netcoreapp2.0",
"defaultValue": "netcoreapp2.0"
},
"HostIdentifier": {
"type": "bind",
"binding": "HostIdentifier"
},
"skipRestore": {
"type": "parameter",
"datatype": "bool",
"description": "If specified, skips the automatic restore of the project on create.",
"defaultValue": "false"
}
},
"tags": {
"language": "C#",
"type": "project"
},
"postActions": [
{
"condition": "(!skipRestore)",
"description": "Restore NuGet packages required by this project.",
"manualInstructions": [
{
"text": "Run 'dotnet restore'"
}
],
"actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
"continueOnError": true
},
{
"condition": "(HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\")",
"actionId": "AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C",
"description": "\n\n-------------------------------------------------------------------\nIMPORTANT: Before running this project on the command line,\n you must restore NPM packages by running \"npm install\"\n-------------------------------------------------------------------\n",
"manualInstructions": [
{
"text": "Run \"npm install\""
}
]
}
]
}

View File

@@ -0,0 +1,20 @@
{
"$schema": "http://json.schemastore.org/vs-2017.3.host",
"name": {
"text": "Vue.js",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1600"
},
"description": {
"text": "A project template for creating an ASP.NET Core application with Vue.js",
"package": "{0CD94836-1526-4E85-87D3-FB5274C5AFC9}",
"id": "1601"
},
"order": 301,
"icon": "icon.png",
"learnMoreLink": "https://github.com/aspnet/JavaScriptServices",
"uiFilters": [
"oneaspnet"
],
"minFullFrameworkVersion": "4.6.1"
}

Some files were not shown because too many files have changed in this diff Show More