mirror of
https://github.com/aspnet/JavaScriptServices.git
synced 2025-12-23 10:08:57 +00:00
Compare commits
1 Commits
version-1.
...
581-isomor
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c9892ab18 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -13,6 +13,7 @@ PublishProfiles/
|
|||||||
*.docstates
|
*.docstates
|
||||||
_ReSharper.*
|
_ReSharper.*
|
||||||
nuget.exe
|
nuget.exe
|
||||||
|
project.lock.json
|
||||||
*net45.csproj
|
*net45.csproj
|
||||||
*net451.csproj
|
*net451.csproj
|
||||||
*k10.csproj
|
*k10.csproj
|
||||||
@@ -38,5 +39,3 @@ npm-debug.log
|
|||||||
/templates/*/ClientApp/dist/
|
/templates/*/ClientApp/dist/
|
||||||
/templates/*/yarn.lock
|
/templates/*/yarn.lock
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
/templates/*/Properties/launchSettings.json
|
|
||||||
|
|||||||
@@ -10,10 +10,11 @@ addons:
|
|||||||
- libssl-dev
|
- libssl-dev
|
||||||
- libunwind8
|
- libunwind8
|
||||||
- zlib1g
|
- zlib1g
|
||||||
mono: none
|
mono:
|
||||||
|
- 4.0.5
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
osx_image: xcode7.1
|
osx_image: xcode7.1
|
||||||
script:
|
script:
|
||||||
- ./build.sh
|
- ./build.sh verify
|
||||||
|
|||||||
@@ -1,68 +1,54 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio 14
|
||||||
VisualStudioVersion = 15.0.26228.4
|
VisualStudioVersion = 14.0.25420.1
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{27304DDE-AFB2-4F8B-B765-E3E2F11E886C}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{E6E88944-4800-40BA-8AF5-069EA3ADFEB8}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.NodeServices", "src\Microsoft.AspNetCore.NodeServices\Microsoft.AspNetCore.NodeServices.csproj", "{66B77203-1469-41DF-92F2-2BE6900BD36F}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.NodeServices", "src\Microsoft.AspNetCore.NodeServices\Microsoft.AspNetCore.NodeServices.xproj", "{B0FA4175-8B29-4904-9780-28B3C24B0567}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.NodeServices.Sockets", "src\Microsoft.AspNetCore.NodeServices.Sockets\Microsoft.AspNetCore.NodeServices.Sockets.csproj", "{F46DEF99-6FAA-4406-B5D8-6FF34EF669E3}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "NodeServicesExamples", "samples\misc\NodeServicesExamples\NodeServicesExamples.xproj", "{6D4BCDD6-7951-449B-BE55-CB7F014B7430}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SpaServices", "src\Microsoft.AspNetCore.SpaServices\Microsoft.AspNetCore.SpaServices.csproj", "{66B071A8-EFC8-4A06-BEF6-06B99AE27EEC}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{78DAC76C-1092-45AB-BF0D-594B8C7B6569}"
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.AngularServices", "src\Microsoft.AspNetCore.AngularServices\Microsoft.AspNetCore.AngularServices.csproj", "{58AAABB6-9D21-42F6-BC97-3DD282B55FD6}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ReactServices", "src\Microsoft.AspNetCore.ReactServices\Microsoft.AspNetCore.ReactServices.csproj", "{F1081B9A-8D67-4A5E-80C6-615F9A975D4F}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "misc", "misc", "{99EAF1FE-22C8-4526-BE78-74B24125D37F}"
|
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
.gitignore = .gitignore
|
|
||||||
global.json = global.json
|
global.json = global.json
|
||||||
README.md = README.md
|
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{23836492-E7F4-4376-85BF-A635C304AC46}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MusicStore", "samples\angular\MusicStore\MusicStore.xproj", "{1A74148F-9DC0-435D-B5AC-7D1B0D3D5E0B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "misc", "misc", "{E6A161EA-646C-4033-9090-95BE809AB8D9}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ReactGrid", "samples\react\ReactGrid\ReactGrid.xproj", "{ABF90A5B-F4E0-438C-A6E4-9549FB43690B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LatencyTest", "samples\misc\LatencyTest\LatencyTest.csproj", "{1931B19A-EC42-4D56-B2D0-FB06D17244DA}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.AngularServices", "src\Microsoft.AspNetCore.AngularServices\Microsoft.AspNetCore.AngularServices.xproj", "{421807E6-B62C-417B-B901-46C5DEDAA8F1}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Webpack", "samples\misc\Webpack\Webpack.csproj", "{DE479DC3-1461-4EAD-A188-4AF7AA4AE344}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.ReactServices", "src\Microsoft.AspNetCore.ReactServices\Microsoft.AspNetCore.ReactServices.xproj", "{B04381DE-991F-4831-A0B5-FE1BD3EF80C4}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NodeServicesExamples", "samples\misc\NodeServicesExamples\NodeServicesExamples.csproj", "{93EFCC5F-C6EE-4623-894F-A42B22C0B6FE}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.SpaServices", "src\Microsoft.AspNetCore.SpaServices\Microsoft.AspNetCore.SpaServices.xproj", "{4624F728-6DFF-44B6-93B5-3C7D9C94BF3F}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "angular", "angular", "{B54435EB-D5E8-4CEC-A02E-DDCB0C750E34}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Templates", "Templates", "{727E6D58-6830-4792-96C6-E138A33959FB}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore", "samples\angular\MusicStore\MusicStore.csproj", "{63FC66E7-559B-4426-93E1-2D951EFC8293}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Angular2Spa", "templates\Angular2Spa\Angular2Spa.xproj", "{8F5CB8A9-3086-4B49-A1C2-32A9F89BCA11}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "react", "react", "{BD77E73E-13BC-4550-99DA-51869BD8DFC4}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ReactReduxSpa", "templates\ReactReduxSpa\ReactReduxSpa.xproj", "{DBFC6DB0-A6D1-4694-A108-1C604B988DA3}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactGrid", "samples\react\ReactGrid\ReactGrid.csproj", "{3B023106-88DB-4C3A-B01F-C1AECB02D80B}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ReactSpa", "templates\ReactSpa\ReactSpa.xproj", "{E9D1A695-F0E6-46F2-B5E3-72F4AF805387}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore", "samples\react\MusicStore\MusicStore.csproj", "{6E898586-79CA-4AA8-946E-943B3682F376}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "WebApplicationBasic", "templates\WebApplicationBasic\WebApplicationBasic.xproj", "{CB4398D6-B7F1-449A-AE02-828769679232}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "templates", "templates", "{1598B415-73F1-4B37-B3B4-0A10677ABB2D}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{E0771531-BE20-40CD-A1B0-A57E09511060}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KnockoutSpa", "templates\KnockoutSpa\KnockoutSpa.csproj", "{F60248B1-940E-43FB-BEA0-589362AA6320}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Webpack", "samples\misc\Webpack\Webpack.xproj", "{A8905301-8492-42FD-9E83-F715A0FDC3A2}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AngularSpa", "templates\AngularSpa\AngularSpa.csproj", "{4D4B84C9-13F7-40CA-B05A-DC98FD6019AC}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "LatencyTest", "samples\misc\LatencyTest\LatencyTest.xproj", "{A64AF9D9-72AA-4433-BE1D-DC2524B6808A}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AureliaSpa", "templates\AureliaSpa\AureliaSpa.csproj", "{4D57B6E1-7141-48ED-959E-872BDD4A2F72}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "React", "React", "{E0EBA813-4478-4C02-B11D-FB3793113FE4}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactSpa", "templates\ReactSpa\ReactSpa.csproj", "{868A630E-C61B-4807-B7A8-7EB53BE1C28A}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MusicStore", "samples\react\MusicStore\MusicStore.xproj", "{C870A92C-9E3F-4BF2-82B8-5758545A8B7C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactReduxSpa", "templates\ReactReduxSpa\ReactReduxSpa.csproj", "{9D4D15A1-A25B-44EC-AB63-F1CE9986712E}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Angular", "Angular", "{4867A616-83D6-48DC-964D-6AE743596631}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApplicationBasic", "templates\WebApplicationBasic\WebApplicationBasic.csproj", "{86911E07-C733-4C18-B49F-9A007A651246}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Aurelia", "templates\AureliaSpa\Aurelia.xproj", "{33D8DAD9-74F9-471D-8BAD-55F828FAA736}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{E415FE14-13B0-469F-836D-95059E6BAA6E}"
|
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "KnockoutSpa", "templates\KnockoutSpa\KnockoutSpa.xproj", "{85231B41-6998-49AE-ABD2-5124C83DBEF2}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
|
||||||
src\build\common.props = src\build\common.props
|
|
||||||
src\build\Key.snk = src\build\Key.snk
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VueSpa", "templates\VueSpa\VueSpa.csproj", "{49D7665A-20EC-43FC-B8E8-EA0204F2D8C3}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -70,104 +56,89 @@ Global
|
|||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{66B77203-1469-41DF-92F2-2BE6900BD36F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B0FA4175-8B29-4904-9780-28B3C24B0567}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{66B77203-1469-41DF-92F2-2BE6900BD36F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B0FA4175-8B29-4904-9780-28B3C24B0567}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{66B77203-1469-41DF-92F2-2BE6900BD36F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B0FA4175-8B29-4904-9780-28B3C24B0567}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{66B77203-1469-41DF-92F2-2BE6900BD36F}.Release|Any CPU.Build.0 = Release|Any CPU
|
{B0FA4175-8B29-4904-9780-28B3C24B0567}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F46DEF99-6FAA-4406-B5D8-6FF34EF669E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{6D4BCDD6-7951-449B-BE55-CB7F014B7430}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F46DEF99-6FAA-4406-B5D8-6FF34EF669E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{6D4BCDD6-7951-449B-BE55-CB7F014B7430}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F46DEF99-6FAA-4406-B5D8-6FF34EF669E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{6D4BCDD6-7951-449B-BE55-CB7F014B7430}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F46DEF99-6FAA-4406-B5D8-6FF34EF669E3}.Release|Any CPU.Build.0 = Release|Any CPU
|
{6D4BCDD6-7951-449B-BE55-CB7F014B7430}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{66B071A8-EFC8-4A06-BEF6-06B99AE27EEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{1A74148F-9DC0-435D-B5AC-7D1B0D3D5E0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{66B071A8-EFC8-4A06-BEF6-06B99AE27EEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{1A74148F-9DC0-435D-B5AC-7D1B0D3D5E0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{66B071A8-EFC8-4A06-BEF6-06B99AE27EEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{1A74148F-9DC0-435D-B5AC-7D1B0D3D5E0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{66B071A8-EFC8-4A06-BEF6-06B99AE27EEC}.Release|Any CPU.Build.0 = Release|Any CPU
|
{1A74148F-9DC0-435D-B5AC-7D1B0D3D5E0B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{58AAABB6-9D21-42F6-BC97-3DD282B55FD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{ABF90A5B-F4E0-438C-A6E4-9549FB43690B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{58AAABB6-9D21-42F6-BC97-3DD282B55FD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{ABF90A5B-F4E0-438C-A6E4-9549FB43690B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{58AAABB6-9D21-42F6-BC97-3DD282B55FD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{ABF90A5B-F4E0-438C-A6E4-9549FB43690B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{58AAABB6-9D21-42F6-BC97-3DD282B55FD6}.Release|Any CPU.Build.0 = Release|Any CPU
|
{ABF90A5B-F4E0-438C-A6E4-9549FB43690B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F1081B9A-8D67-4A5E-80C6-615F9A975D4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{421807E6-B62C-417B-B901-46C5DEDAA8F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F1081B9A-8D67-4A5E-80C6-615F9A975D4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{421807E6-B62C-417B-B901-46C5DEDAA8F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F1081B9A-8D67-4A5E-80C6-615F9A975D4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{421807E6-B62C-417B-B901-46C5DEDAA8F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F1081B9A-8D67-4A5E-80C6-615F9A975D4F}.Release|Any CPU.Build.0 = Release|Any CPU
|
{421807E6-B62C-417B-B901-46C5DEDAA8F1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{1931B19A-EC42-4D56-B2D0-FB06D17244DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B04381DE-991F-4831-A0B5-FE1BD3EF80C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{1931B19A-EC42-4D56-B2D0-FB06D17244DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B04381DE-991F-4831-A0B5-FE1BD3EF80C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{1931B19A-EC42-4D56-B2D0-FB06D17244DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B04381DE-991F-4831-A0B5-FE1BD3EF80C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{1931B19A-EC42-4D56-B2D0-FB06D17244DA}.Release|Any CPU.Build.0 = Release|Any CPU
|
{B04381DE-991F-4831-A0B5-FE1BD3EF80C4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{DE479DC3-1461-4EAD-A188-4AF7AA4AE344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{4624F728-6DFF-44B6-93B5-3C7D9C94BF3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{DE479DC3-1461-4EAD-A188-4AF7AA4AE344}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{4624F728-6DFF-44B6-93B5-3C7D9C94BF3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{DE479DC3-1461-4EAD-A188-4AF7AA4AE344}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4624F728-6DFF-44B6-93B5-3C7D9C94BF3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{DE479DC3-1461-4EAD-A188-4AF7AA4AE344}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4624F728-6DFF-44B6-93B5-3C7D9C94BF3F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{93EFCC5F-C6EE-4623-894F-A42B22C0B6FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{8F5CB8A9-3086-4B49-A1C2-32A9F89BCA11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{93EFCC5F-C6EE-4623-894F-A42B22C0B6FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{8F5CB8A9-3086-4B49-A1C2-32A9F89BCA11}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{93EFCC5F-C6EE-4623-894F-A42B22C0B6FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{8F5CB8A9-3086-4B49-A1C2-32A9F89BCA11}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{93EFCC5F-C6EE-4623-894F-A42B22C0B6FE}.Release|Any CPU.Build.0 = Release|Any CPU
|
{8F5CB8A9-3086-4B49-A1C2-32A9F89BCA11}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{63FC66E7-559B-4426-93E1-2D951EFC8293}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{DBFC6DB0-A6D1-4694-A108-1C604B988DA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{63FC66E7-559B-4426-93E1-2D951EFC8293}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{DBFC6DB0-A6D1-4694-A108-1C604B988DA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{63FC66E7-559B-4426-93E1-2D951EFC8293}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{DBFC6DB0-A6D1-4694-A108-1C604B988DA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{63FC66E7-559B-4426-93E1-2D951EFC8293}.Release|Any CPU.Build.0 = Release|Any CPU
|
{DBFC6DB0-A6D1-4694-A108-1C604B988DA3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{3B023106-88DB-4C3A-B01F-C1AECB02D80B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E9D1A695-F0E6-46F2-B5E3-72F4AF805387}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{3B023106-88DB-4C3A-B01F-C1AECB02D80B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E9D1A695-F0E6-46F2-B5E3-72F4AF805387}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{3B023106-88DB-4C3A-B01F-C1AECB02D80B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{E9D1A695-F0E6-46F2-B5E3-72F4AF805387}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{3B023106-88DB-4C3A-B01F-C1AECB02D80B}.Release|Any CPU.Build.0 = Release|Any CPU
|
{E9D1A695-F0E6-46F2-B5E3-72F4AF805387}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{6E898586-79CA-4AA8-946E-943B3682F376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{CB4398D6-B7F1-449A-AE02-828769679232}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{6E898586-79CA-4AA8-946E-943B3682F376}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{CB4398D6-B7F1-449A-AE02-828769679232}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{6E898586-79CA-4AA8-946E-943B3682F376}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{CB4398D6-B7F1-449A-AE02-828769679232}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{6E898586-79CA-4AA8-946E-943B3682F376}.Release|Any CPU.Build.0 = Release|Any CPU
|
{CB4398D6-B7F1-449A-AE02-828769679232}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F60248B1-940E-43FB-BEA0-589362AA6320}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{A8905301-8492-42FD-9E83-F715A0FDC3A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F60248B1-940E-43FB-BEA0-589362AA6320}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{A8905301-8492-42FD-9E83-F715A0FDC3A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F60248B1-940E-43FB-BEA0-589362AA6320}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{A8905301-8492-42FD-9E83-F715A0FDC3A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F60248B1-940E-43FB-BEA0-589362AA6320}.Release|Any CPU.Build.0 = Release|Any CPU
|
{A8905301-8492-42FD-9E83-F715A0FDC3A2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{4D4B84C9-13F7-40CA-B05A-DC98FD6019AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{A64AF9D9-72AA-4433-BE1D-DC2524B6808A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{4D4B84C9-13F7-40CA-B05A-DC98FD6019AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{A64AF9D9-72AA-4433-BE1D-DC2524B6808A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{4D4B84C9-13F7-40CA-B05A-DC98FD6019AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{A64AF9D9-72AA-4433-BE1D-DC2524B6808A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4D4B84C9-13F7-40CA-B05A-DC98FD6019AC}.Release|Any CPU.Build.0 = Release|Any CPU
|
{A64AF9D9-72AA-4433-BE1D-DC2524B6808A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{4D57B6E1-7141-48ED-959E-872BDD4A2F72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{C870A92C-9E3F-4BF2-82B8-5758545A8B7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{4D57B6E1-7141-48ED-959E-872BDD4A2F72}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{C870A92C-9E3F-4BF2-82B8-5758545A8B7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{4D57B6E1-7141-48ED-959E-872BDD4A2F72}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{C870A92C-9E3F-4BF2-82B8-5758545A8B7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4D57B6E1-7141-48ED-959E-872BDD4A2F72}.Release|Any CPU.Build.0 = Release|Any CPU
|
{C870A92C-9E3F-4BF2-82B8-5758545A8B7C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{868A630E-C61B-4807-B7A8-7EB53BE1C28A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{33D8DAD9-74F9-471D-8BAD-55F828FAA736}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{868A630E-C61B-4807-B7A8-7EB53BE1C28A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{33D8DAD9-74F9-471D-8BAD-55F828FAA736}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{868A630E-C61B-4807-B7A8-7EB53BE1C28A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{33D8DAD9-74F9-471D-8BAD-55F828FAA736}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{868A630E-C61B-4807-B7A8-7EB53BE1C28A}.Release|Any CPU.Build.0 = Release|Any CPU
|
{33D8DAD9-74F9-471D-8BAD-55F828FAA736}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{9D4D15A1-A25B-44EC-AB63-F1CE9986712E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{85231B41-6998-49AE-ABD2-5124C83DBEF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{9D4D15A1-A25B-44EC-AB63-F1CE9986712E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{85231B41-6998-49AE-ABD2-5124C83DBEF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{9D4D15A1-A25B-44EC-AB63-F1CE9986712E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{85231B41-6998-49AE-ABD2-5124C83DBEF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{9D4D15A1-A25B-44EC-AB63-F1CE9986712E}.Release|Any CPU.Build.0 = Release|Any CPU
|
{85231B41-6998-49AE-ABD2-5124C83DBEF2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{86911E07-C733-4C18-B49F-9A007A651246}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{86911E07-C733-4C18-B49F-9A007A651246}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{86911E07-C733-4C18-B49F-9A007A651246}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{86911E07-C733-4C18-B49F-9A007A651246}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{49D7665A-20EC-43FC-B8E8-EA0204F2D8C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{49D7665A-20EC-43FC-B8E8-EA0204F2D8C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{49D7665A-20EC-43FC-B8E8-EA0204F2D8C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{49D7665A-20EC-43FC-B8E8-EA0204F2D8C3}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{66B77203-1469-41DF-92F2-2BE6900BD36F} = {27304DDE-AFB2-4F8B-B765-E3E2F11E886C}
|
{6D4BCDD6-7951-449B-BE55-CB7F014B7430} = {E0771531-BE20-40CD-A1B0-A57E09511060}
|
||||||
{F46DEF99-6FAA-4406-B5D8-6FF34EF669E3} = {27304DDE-AFB2-4F8B-B765-E3E2F11E886C}
|
{1A74148F-9DC0-435D-B5AC-7D1B0D3D5E0B} = {4867A616-83D6-48DC-964D-6AE743596631}
|
||||||
{66B071A8-EFC8-4A06-BEF6-06B99AE27EEC} = {27304DDE-AFB2-4F8B-B765-E3E2F11E886C}
|
{ABF90A5B-F4E0-438C-A6E4-9549FB43690B} = {E0EBA813-4478-4C02-B11D-FB3793113FE4}
|
||||||
{58AAABB6-9D21-42F6-BC97-3DD282B55FD6} = {27304DDE-AFB2-4F8B-B765-E3E2F11E886C}
|
{8F5CB8A9-3086-4B49-A1C2-32A9F89BCA11} = {727E6D58-6830-4792-96C6-E138A33959FB}
|
||||||
{F1081B9A-8D67-4A5E-80C6-615F9A975D4F} = {27304DDE-AFB2-4F8B-B765-E3E2F11E886C}
|
{DBFC6DB0-A6D1-4694-A108-1C604B988DA3} = {727E6D58-6830-4792-96C6-E138A33959FB}
|
||||||
{E6A161EA-646C-4033-9090-95BE809AB8D9} = {23836492-E7F4-4376-85BF-A635C304AC46}
|
{E9D1A695-F0E6-46F2-B5E3-72F4AF805387} = {727E6D58-6830-4792-96C6-E138A33959FB}
|
||||||
{1931B19A-EC42-4D56-B2D0-FB06D17244DA} = {E6A161EA-646C-4033-9090-95BE809AB8D9}
|
{CB4398D6-B7F1-449A-AE02-828769679232} = {727E6D58-6830-4792-96C6-E138A33959FB}
|
||||||
{DE479DC3-1461-4EAD-A188-4AF7AA4AE344} = {E6A161EA-646C-4033-9090-95BE809AB8D9}
|
{E0771531-BE20-40CD-A1B0-A57E09511060} = {E6E88944-4800-40BA-8AF5-069EA3ADFEB8}
|
||||||
{93EFCC5F-C6EE-4623-894F-A42B22C0B6FE} = {E6A161EA-646C-4033-9090-95BE809AB8D9}
|
{A8905301-8492-42FD-9E83-F715A0FDC3A2} = {E0771531-BE20-40CD-A1B0-A57E09511060}
|
||||||
{B54435EB-D5E8-4CEC-A02E-DDCB0C750E34} = {23836492-E7F4-4376-85BF-A635C304AC46}
|
{A64AF9D9-72AA-4433-BE1D-DC2524B6808A} = {E0771531-BE20-40CD-A1B0-A57E09511060}
|
||||||
{63FC66E7-559B-4426-93E1-2D951EFC8293} = {B54435EB-D5E8-4CEC-A02E-DDCB0C750E34}
|
{E0EBA813-4478-4C02-B11D-FB3793113FE4} = {E6E88944-4800-40BA-8AF5-069EA3ADFEB8}
|
||||||
{BD77E73E-13BC-4550-99DA-51869BD8DFC4} = {23836492-E7F4-4376-85BF-A635C304AC46}
|
{C870A92C-9E3F-4BF2-82B8-5758545A8B7C} = {E0EBA813-4478-4C02-B11D-FB3793113FE4}
|
||||||
{3B023106-88DB-4C3A-B01F-C1AECB02D80B} = {BD77E73E-13BC-4550-99DA-51869BD8DFC4}
|
{4867A616-83D6-48DC-964D-6AE743596631} = {E6E88944-4800-40BA-8AF5-069EA3ADFEB8}
|
||||||
{6E898586-79CA-4AA8-946E-943B3682F376} = {BD77E73E-13BC-4550-99DA-51869BD8DFC4}
|
{33D8DAD9-74F9-471D-8BAD-55F828FAA736} = {727E6D58-6830-4792-96C6-E138A33959FB}
|
||||||
{F60248B1-940E-43FB-BEA0-589362AA6320} = {1598B415-73F1-4B37-B3B4-0A10677ABB2D}
|
{85231B41-6998-49AE-ABD2-5124C83DBEF2} = {727E6D58-6830-4792-96C6-E138A33959FB}
|
||||||
{4D4B84C9-13F7-40CA-B05A-DC98FD6019AC} = {1598B415-73F1-4B37-B3B4-0A10677ABB2D}
|
|
||||||
{4D57B6E1-7141-48ED-959E-872BDD4A2F72} = {1598B415-73F1-4B37-B3B4-0A10677ABB2D}
|
|
||||||
{868A630E-C61B-4807-B7A8-7EB53BE1C28A} = {1598B415-73F1-4B37-B3B4-0A10677ABB2D}
|
|
||||||
{9D4D15A1-A25B-44EC-AB63-F1CE9986712E} = {1598B415-73F1-4B37-B3B4-0A10677ABB2D}
|
|
||||||
{86911E07-C733-4C18-B49F-9A007A651246} = {1598B415-73F1-4B37-B3B4-0A10677ABB2D}
|
|
||||||
{E415FE14-13B0-469F-836D-95059E6BAA6E} = {27304DDE-AFB2-4F8B-B765-E3E2F11E886C}
|
|
||||||
{49D7665A-20EC-43FC-B8E8-EA0204F2D8C3} = {1598B415-73F1-4B37-B3B4-0A10677ABB2D}
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<configuration>
|
|
||||||
<packageSources>
|
|
||||||
<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="NuGet" value="https://api.nuget.org/v3/index.json" />
|
|
||||||
</packageSources>
|
|
||||||
</configuration>
|
|
||||||
8
NuGet.master.config
Executable file
8
NuGet.master.config
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<packageSources>
|
||||||
|
<clear />
|
||||||
|
<add key="AspNetVNext" value="https://www.myget.org/f/aspnetmaster/api/v3/index.json" />
|
||||||
|
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
|
||||||
|
</packageSources>
|
||||||
|
</configuration>
|
||||||
51
README.md
51
README.md
@@ -6,13 +6,7 @@ This project is part of ASP.NET Core. You can find samples, documentation and ge
|
|||||||
|
|
||||||
## What is this?
|
## What is this?
|
||||||
|
|
||||||
`JavaScriptServices` is a set of client-side technologies for ASP.NET Core. It provides infrastructure that you'll find useful if you:
|
`JavaScriptServices` is a set of technologies for ASP.NET Core developers. It provides infrastructure that you'll find useful if you use Angular 2 / React / Knockout / etc. on the client, or if you build your client-side resources using Webpack, or otherwise want to execute JavaScript on the server at runtime.
|
||||||
|
|
||||||
- Use Angular / React / Vue / Aurelia / Knockout / etc.
|
|
||||||
- Build your client-side resources using Webpack.
|
|
||||||
- Execute JavaScript on the server at runtime.
|
|
||||||
|
|
||||||
Read [Building Single Page Applications on ASP.NET Core with JavaScriptServices](https://blogs.msdn.microsoft.com/webdev/2017/02/14/building-single-page-applications-on-asp-net-core-with-javascriptservices/) for more details.
|
|
||||||
|
|
||||||
This repo contains:
|
This repo contains:
|
||||||
|
|
||||||
@@ -23,26 +17,27 @@ This repo contains:
|
|||||||
* Hot module replacement (HMR) ([docs](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices#webpack-hot-module-replacement))
|
* Hot module replacement (HMR) ([docs](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices#webpack-hot-module-replacement))
|
||||||
* Server-side and client-side routing integration ([docs](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices#routing-helper-mapspafallbackroute))
|
* Server-side and client-side routing integration ([docs](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices#routing-helper-mapspafallbackroute))
|
||||||
* Server-side and client-side validation integration
|
* Server-side and client-side validation integration
|
||||||
|
* "Cache priming" for Angular 2 apps
|
||||||
* "Lazy loading" for Knockout apps
|
* "Lazy loading" for Knockout apps
|
||||||
* A Yeoman generator that creates preconfigured app starting points ([guide](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/))
|
* A Yeoman generator that creates preconfigured app starting points ([guide](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/))
|
||||||
* Samples and docs
|
* Samples and docs
|
||||||
|
|
||||||
It's cross-platform (Windows, Linux, or macOS) and works with .NET Core 1.0.1 or later.
|
Everything here is cross-platform, and works with .NET Core 1.0.1 or later on Windows, Linux, or OS X.
|
||||||
|
|
||||||
## Creating new applications
|
## Creating new applications
|
||||||
|
|
||||||
If you want to build a brand-new ASP.NET Core app that uses Angular / React / Knockout on the client, consider starting with the `aspnetcore-spa` generator. This lets you choose your client-side framework. It generates a starting point that includes applicable features such as Webpack dev middleware, server-side prerendering, and efficient production builds. It's much easier than configuring everything to work together manually!
|
If you want to build a brand-new ASP.NET Core app that uses Angular 2 / React / Knockout on the client, consider starting with the `aspnetcore-spa` generator. This lets you choose your client-side framework, and generates a starting point that includes applicable features such as Webpack dev middleware, server-side prerendering, and efficient production builds. It's much easier than configuring everything to work together manually!
|
||||||
|
|
||||||
To do this, install Yeoman and these generator templates:
|
To do this, first install Yeoman and these generator templates:
|
||||||
|
|
||||||
npm install -g yo generator-aspnetcore-spa
|
npm install -g yo generator-aspnetcore-spa
|
||||||
|
|
||||||
Generate your new application starting point:
|
Then you can generate your new application starting point:
|
||||||
|
|
||||||
cd some-empty-directory
|
cd some-empty-directory
|
||||||
yo aspnetcore-spa
|
yo aspnetcore-spa
|
||||||
|
|
||||||
Once the generator has run and restored all the dependencies, you can start up your new ASP.NET Core SPA:
|
Finally, once the generator has run and restored all the dependencies, you can start up your new ASP.NET Core Single Page Application:
|
||||||
|
|
||||||
dotnet run
|
dotnet run
|
||||||
|
|
||||||
@@ -57,11 +52,11 @@ If you have an existing ASP.NET Core application, or if you just want to use the
|
|||||||
* Most applications developers don't need to use this directly, but you can do so if you want to implement your own functionality that involves calling Node.js code from .NET at runtime.
|
* Most applications developers don't need to use this directly, but you can do so if you want to implement your own functionality that involves calling Node.js code from .NET at runtime.
|
||||||
* Find [documentation and usage examples here](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.NodeServices#microsoftaspnetcorenodeservices).
|
* Find [documentation and usage examples here](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.NodeServices#microsoftaspnetcorenodeservices).
|
||||||
* `Microsoft.AspNetCore.SpaServices`
|
* `Microsoft.AspNetCore.SpaServices`
|
||||||
* This provides infrastructure that's generally useful when building Single Page Applications (SPAs) with technologies such as Angular or React (for example, server-side prerendering and webpack middleware). Internally, it uses the `NodeServices` package to implement its features.
|
* This provides infrastructure that's generally useful when building Single Page Applications (SPAs) with technologies such as Angular 2 or React (for example, server-side prerendering and webpack middleware). Internally, it uses the `NodeServices` package to implement its features.
|
||||||
* Find [documentation and usage examples here](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices#microsoftaspnetcorespaservices).
|
* Find [documentation and usage examples here](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices#microsoftaspnetcorespaservices).
|
||||||
* `Microsoft.AspNetCore.AngularServices`
|
* `Microsoft.AspNetCore.AngularServices`
|
||||||
* This builds on the `SpaServices` package and includes features specific to Angular. Currently, this includes validation helpers.
|
* This builds on the `SpaServices` package and includes features specific to Angular 2. Currently, this includes validation helpers and a "cache priming" feature, which let you pre-evaluate ajax requests on the server so that client-side code doesn't need to make network calls once it's loaded.
|
||||||
* The code is [here](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.AngularServices). You'll find a usage example for [the validation helper here](https://github.com/aspnet/JavaScriptServices/blob/dev/samples/angular/MusicStore/wwwroot/ng-app/components/admin/album-edit/album-edit.ts).
|
* The code is [here](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.AngularServices), and you'll find a usage example for [the validation helper here](https://github.com/aspnet/JavaScriptServices/blob/dev/samples/angular/MusicStore/wwwroot/ng-app/components/admin/album-edit/album-edit.ts), and for the [cache priming here](https://github.com/aspnet/JavaScriptServices/blob/dev/samples/angular/MusicStore/Views/Home/Index.cshtml#L7-8). Full docs are to be written.
|
||||||
|
|
||||||
There was previously a `Microsoft.AspNetCore.ReactServices` but this is not currently needed - all applicable functionality is in `Microsoft.AspNetCore.SpaServices`, because it's sufficiently general. We might add a new `Microsoft.AspNetCore.ReactServices` package in the future if new React-specific requirements emerge.
|
There was previously a `Microsoft.AspNetCore.ReactServices` but this is not currently needed - all applicable functionality is in `Microsoft.AspNetCore.SpaServices`, because it's sufficiently general. We might add a new `Microsoft.AspNetCore.ReactServices` package in the future if new React-specific requirements emerge.
|
||||||
|
|
||||||
@@ -69,32 +64,28 @@ If you want to build a helper library for some other SPA framework, you can do s
|
|||||||
|
|
||||||
## Samples and templates
|
## Samples and templates
|
||||||
|
|
||||||
Inside this repo, [the `templates` directory](https://github.com/aspnet/JavaScriptServices/tree/dev/templates) contains the application starting points that the `aspnetcore-spa` generator emits. You can clone this repo and run those applications directly. But it's easier to [use the Yeoman tool to run the generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/).
|
Inside this repo, [the `templates` directory](https://github.com/aspnet/JavaScriptServices/tree/dev/templates) contains the application starting points that the `aspnetcore-spa` generator emits. If you want, you can clone this repo and run those applications directly. But it's easier to [use the Yeoman tool to run the generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/).
|
||||||
|
|
||||||
The [`samples` directory](https://github.com/aspnet/JavaScriptServices/tree/dev/samples) contains examples of:
|
Also in this repo, [the `samples` directory](https://github.com/aspnet/JavaScriptServices/tree/dev/samples) contains examples of using the JavaScript services family of packages with Angular 2 and React, plus examples of standalone `NodeServices` usage for runtime code transpilation and image processing.
|
||||||
|
|
||||||
- Using the JavaScript services family of packages with Angular and React.
|
|
||||||
- A standalone `NodeServices` usage for runtime code transpilation and image processing.
|
|
||||||
|
|
||||||
**To run the samples:**
|
**To run the samples:**
|
||||||
|
|
||||||
* Clone this repo
|
* Clone this repo
|
||||||
* At the repo's root directory (the one containing `src`, `samples`, etc.), run `dotnet restore`
|
* At the repo's root directory (the one containing `src`, `samples`, etc.), run `dotnet restore`
|
||||||
* Change directory to the sample you want to run (for example, `cd samples/angular/MusicStore`)
|
* Change directory to the sample you want to run (e.g., `cd samples/angular/MusicStore`)
|
||||||
* Restore Node dependencies by running `npm install`
|
* Restore Node dependencies by running `npm install`
|
||||||
* If you're trying to run the Angular "Music Store" sample, then also run `gulp` (which you need to have installed globally). None of the other samples require this.
|
* If you're trying to run the Angular 2 "Music Store" sample, then also run `gulp` (which you need to have installed globally). None of the other samples require this.
|
||||||
* Run the application (`dotnet run`)
|
* Run the application (`dotnet run`)
|
||||||
* Browse to [http://localhost:5000](http://localhost:5000)
|
* Browse to [http://localhost:5000](http://localhost:5000)
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
If you're interested in contributing to the various packages, samples, and project templates in this repo, that's great! You can run the code in this repo as follows:
|
If you're interested in contributing to the various packages, samples, and project templates in this repo, that's great! You can run the code in this repo just by:
|
||||||
|
|
||||||
* Clone the repo
|
* Cloning the repo
|
||||||
* Run `dotnet restore` at the repo root dir
|
* Running `dotnet restore` at the repo root dir
|
||||||
* Go to whatever sample or template you want to run (for example, `cd templates/AngularSpa`)
|
* Going to whatever sample or template you want to run (e.g., `cd templates/Angular2Spa`)
|
||||||
* Restore NPM dependencies (run `npm install`)
|
* Restoring NPM dependencies (run `npm install`)
|
||||||
* If the sample/template you're trying to run has a file called `webpack.config.vendor.js` at its root, run `webpack --config webpack.config.vendor.js`. It it has a file called `webpack.config.js`, run `webpack` (no args). You might need to install webpack first, by running `npm install -g webpack`.
|
* Launching it (`dotnet run`)
|
||||||
* Launch it (`dotnet run`)
|
|
||||||
|
|
||||||
If you're planning to submit a pull request, and if it's more than a trivial fix (for example, for a typo), it's usually a good idea first to file an issue describing what you're proposing to do and how it will work. Then you can find out if it's likely that such a pull request will be accepted, and how it fits into wider ongoing plans.
|
If you're planning to submit a pull request, and if it's more than a trivial fix (e.g., for a typo), it's usually a good idea first to file an issue describing what you're proposing to do and how it will work. Then you can find out if it's likely that such a pull request will be accepted, and how it fits into wider ongoing plans.
|
||||||
|
|||||||
20
appveyor.yml
20
appveyor.yml
@@ -4,12 +4,17 @@ install:
|
|||||||
- ps: Install-Product node 6.9.2 x64
|
- ps: Install-Product node 6.9.2 x64
|
||||||
# .NET Core SDK binaries
|
# .NET Core SDK binaries
|
||||||
# Download .NET Core SDK and add to PATH
|
# Download .NET Core SDK and add to PATH
|
||||||
- ps: $urlCurrent = "https://download.microsoft.com/download/E/7/8/E782433E-7737-4E6C-BFBF-290A0A81C3D7/dotnet-dev-win-x64.1.0.4.zip"
|
- ps: $urlCurrent = "https://go.microsoft.com/fwlink/?LinkID=834991"
|
||||||
|
- ps: $urlPreview = "https://dotnetcli.blob.core.windows.net/dotnet/Sdk/rel-1.0.0/dotnet-dev-win-x64.latest.zip"
|
||||||
- ps: $env:DOTNET_INSTALL_DIR = "$pwd\.dotnetsdk"
|
- ps: $env:DOTNET_INSTALL_DIR = "$pwd\.dotnetsdk"
|
||||||
- ps: mkdir $env:DOTNET_INSTALL_DIR -Force | Out-Null
|
- ps: mkdir $env:DOTNET_INSTALL_DIR -Force | Out-Null
|
||||||
- ps: $tempFileCurrent = [System.IO.Path]::GetTempFileName()
|
- ps: $tempFileCurrent = [System.IO.Path]::GetTempFileName()
|
||||||
|
- ps: $tempFilePreview = [System.IO.Path]::GetTempFileName()
|
||||||
- ps: (New-Object System.Net.WebClient).DownloadFile($urlCurrent, $tempFileCurrent)
|
- ps: (New-Object System.Net.WebClient).DownloadFile($urlCurrent, $tempFileCurrent)
|
||||||
|
- ps: (New-Object System.Net.WebClient).DownloadFile($urlPreview, $tempFilePreview)
|
||||||
- ps: Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::ExtractToDirectory($tempFileCurrent, $env:DOTNET_INSTALL_DIR)
|
- ps: Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::ExtractToDirectory($tempFileCurrent, $env:DOTNET_INSTALL_DIR)
|
||||||
|
- ps: Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::ExtractToDirectory($tempFilePreview, $env:DOTNET_INSTALL_DIR + "preview")
|
||||||
|
- ps: Copy-Item "${env:DOTNET_INSTALL_DIR}preview\*" "${env:DOTNET_INSTALL_DIR}" -Force -Recurse
|
||||||
- ps: $env:Path = "$env:DOTNET_INSTALL_DIR;$env:Path"
|
- ps: $env:Path = "$env:DOTNET_INSTALL_DIR;$env:Path"
|
||||||
build_script:
|
build_script:
|
||||||
- ps: Push-Location
|
- ps: Push-Location
|
||||||
@@ -20,17 +25,16 @@ build_script:
|
|||||||
artifacts:
|
artifacts:
|
||||||
- path: templates\package-builder\dist\artifacts\generator-aspnetcore-spa.tar.gz
|
- path: templates\package-builder\dist\artifacts\generator-aspnetcore-spa.tar.gz
|
||||||
name: generator-aspnetcore-spa
|
name: generator-aspnetcore-spa
|
||||||
- path: templates\package-builder\dist\artifacts\*.nupkg
|
# - build.cmd verify
|
||||||
name: Microsoft.AspNetCore.SpaTemplates
|
|
||||||
type: NuGetPackage
|
|
||||||
# - ps: .\build.ps1
|
|
||||||
clone_depth: 1
|
clone_depth: 1
|
||||||
test_script:
|
test_script:
|
||||||
- dotnet restore
|
- dotnet restore ./src
|
||||||
|
- npm install -g selenium-standalone
|
||||||
|
- selenium-standalone install
|
||||||
|
# The nosys flag is needed for selenium to work on Appveyor
|
||||||
|
- ps: Start-Process selenium-standalone 'start','--','-Djna.nosys=true'
|
||||||
- ps: Push-Location
|
- ps: Push-Location
|
||||||
- cd test
|
- cd test
|
||||||
- npm install selenium-standalone
|
|
||||||
- ps: Start-Process node './start-selenium.js'
|
|
||||||
- npm install
|
- npm install
|
||||||
- npm test
|
- npm test
|
||||||
on_finish :
|
on_finish :
|
||||||
|
|||||||
@@ -64,4 +64,4 @@ if (!(Test-Path $buildFolder)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&"$buildFile" @args
|
&"$buildFile" $args
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<Project>
|
|
||||||
|
|
||||||
<Import Project="dependencies.props" />
|
|
||||||
<Import Project="version.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<Product>Microsoft ASP.NET Core</Product>
|
|
||||||
<RepositoryUrl>https://github.com/aspnet/javascriptservices</RepositoryUrl>
|
|
||||||
<RepositoryType>git</RepositoryType>
|
|
||||||
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)Key.snk</AssemblyOriginatorKeyFile>
|
|
||||||
<SignAssembly>true</SignAssembly>
|
|
||||||
<PublicSign Condition="'$(OS)' != 'Windows_NT'">true</PublicSign>
|
|
||||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
||||||
<VersionSuffix Condition="'$(VersionSuffix)'!='' AND '$(BuildNumber)' != ''">$(VersionSuffix)-$(BuildNumber)</VersionSuffix>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Internal.AspNetCore.Sdk" Version="$(InternalAspNetCoreSdkVersion)" PrivateAssets="All" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<Project>
|
|
||||||
<PropertyGroup>
|
|
||||||
<AspNetCoreVersion>1.1.0</AspNetCoreVersion>
|
|
||||||
<AspNetCoreMvcVersion>1.1.1</AspNetCoreMvcVersion>
|
|
||||||
<AspNetCoreToolsVersion>1.0.0-msbuild3-final</AspNetCoreToolsVersion>
|
|
||||||
<AutoMapperVersion>5.0.2</AutoMapperVersion>
|
|
||||||
<CoreFxVersion>4.3.0</CoreFxVersion>
|
|
||||||
<JsonNetVersion>10.0.1</JsonNetVersion>
|
|
||||||
<InternalAspNetCoreSdkVersion>2.0.0-*</InternalAspNetCoreSdkVersion>
|
|
||||||
<MicrosoftDataflowVersion>4.5.24</MicrosoftDataflowVersion>
|
|
||||||
<NetStandardImplicitPackageVersion>1.6.1</NetStandardImplicitPackageVersion>
|
|
||||||
<ThreadingDataflowVersion>4.7.0</ThreadingDataflowVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<Project>
|
|
||||||
<Target Name="NpmRestore" AfterTargets="Restore" Condition="'$(PreflightRestore)' != 'true'">
|
|
||||||
<ItemGroup>
|
|
||||||
<NpmModules Include="$(RepositoryRoot)**\package.json"
|
|
||||||
Exclude="$(RepositoryRoot)**\node_modules\**\*" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Message Text="Restoring NPM modules for: %0A - @(NpmModules -> '%(FullPath)','%0A - ')" Importance="high" />
|
|
||||||
|
|
||||||
<Exec Command="npm install" WorkingDirectory="%(NpmModules.RootDir)%(Directory)" />
|
|
||||||
</Target>
|
|
||||||
</Project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<Project>
|
|
||||||
<PropertyGroup>
|
|
||||||
<VersionPrefix>1.1.2</VersionPrefix>
|
|
||||||
<VersionSuffix>preview1</VersionSuffix>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
||||||
4
global.json
Normal file
4
global.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"projects": ["src"],
|
||||||
|
"sdk": { "version": "1.0.0-preview2-1-003177" }
|
||||||
|
}
|
||||||
14
makefile.shade
Executable file
14
makefile.shade
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
var VERSION='0.1'
|
||||||
|
var FULL_VERSION='0.1'
|
||||||
|
var AUTHORS='Microsoft Open Technologies, Inc.'
|
||||||
|
var TEST_PROJECT_GLOB='templates/*/project.json'
|
||||||
|
var SAMPLES_PROJECT_GLOB='samples/misc/*/project.json'
|
||||||
|
|
||||||
|
@{
|
||||||
|
// The build quality values are set in each of the project.json files
|
||||||
|
BuildQuality = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
use-standard-lifecycle
|
||||||
|
k-standard-goals
|
||||||
23
pack-local.sh
Executable file
23
pack-local.sh
Executable file
@@ -0,0 +1,23 @@
|
|||||||
|
versionSuffix=$1
|
||||||
|
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
projects=(
|
||||||
|
./src/Microsoft.AspNetCore.NodeServices
|
||||||
|
./src/Microsoft.AspNetCore.NodeServices.Sockets
|
||||||
|
./src/Microsoft.AspNetCore.SpaServices
|
||||||
|
./src/Microsoft.AspNetCore.AngularServices
|
||||||
|
./src/Microsoft.AspNetCore.ReactServices
|
||||||
|
)
|
||||||
|
|
||||||
|
if [ -z "$versionSuffix" ]; then
|
||||||
|
echo "Usage: pack-local.sh <versionsuffix>"
|
||||||
|
echo "Example: pack-local.sh beta-000001"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
pushd $dir > /dev/null
|
||||||
|
|
||||||
|
for proj in "${projects[@]}"; do
|
||||||
|
dotnet pack $proj --version-suffix $versionSuffix -o ./artifacts/
|
||||||
|
done
|
||||||
|
|
||||||
|
popd > /dev/null
|
||||||
1
samples/angular/MusicStore/.gitignore
vendored
1
samples/angular/MusicStore/.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
/node_modules/
|
/node_modules/
|
||||||
/wwwroot/lib/
|
/wwwroot/lib/
|
||||||
/wwwroot/ng-app/**/*.js
|
/wwwroot/ng-app/**/*.js
|
||||||
|
/project.lock.json
|
||||||
/music-db.sqlite
|
/music-db.sqlite
|
||||||
/Properties/launchSettings.json
|
/Properties/launchSettings.json
|
||||||
|
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<Import Project="..\..\..\build\dependencies.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp1.1</TargetFramework>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.AngularServices\Microsoft.AspNetCore.AngularServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SQLite" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="AutoMapper" Version="$(AutoMapperVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
<Exec Command="gulp" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
20
samples/angular/MusicStore/MusicStore.xproj
Normal file
20
samples/angular/MusicStore/MusicStore.xproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>1a74148f-9dc0-435d-b5ac-7d1b0d3d5e0b</ProjectGuid>
|
||||||
|
<RootNamespace>MusicStore</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<DevelopmentServerPort>5068</DevelopmentServerPort>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
79
samples/angular/MusicStore/project.json
Executable file
79
samples/angular/MusicStore/project.json
Executable file
@@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"version": "1.0.0-*",
|
||||||
|
"buildOptions": {
|
||||||
|
"emitEntryPoint": true,
|
||||||
|
"preserveCompilationContext": true
|
||||||
|
},
|
||||||
|
"runtimeOptions": {
|
||||||
|
"configProperties": {
|
||||||
|
"System.GC.Server": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tooling": {
|
||||||
|
"defaultNamespace": "MusicStore"
|
||||||
|
},
|
||||||
|
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"type": "platform"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.AngularServices": "1.1.0-*",
|
||||||
|
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Mvc": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Razor.Tools": {
|
||||||
|
"version": "1.0.0-preview2-final",
|
||||||
|
"type": "build"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
|
||||||
|
"Microsoft.EntityFrameworkCore.SQLite": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.Json": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.CommandLine": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Console": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Debug": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
|
||||||
|
"AutoMapper": "5.0.2"
|
||||||
|
},
|
||||||
|
|
||||||
|
"tools": {
|
||||||
|
"Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
|
||||||
|
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
|
||||||
|
"Microsoft.DotNet.Watcher.Tools": "1.0.0-preview2-final"
|
||||||
|
},
|
||||||
|
|
||||||
|
"frameworks": {
|
||||||
|
"netcoreapp1.1": {
|
||||||
|
"imports": [
|
||||||
|
"dotnet5.6",
|
||||||
|
"portable-net45+win8"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"publishOptions": {
|
||||||
|
"include": [
|
||||||
|
"appsettings.json",
|
||||||
|
"ClientApp",
|
||||||
|
"node_modules",
|
||||||
|
"typings",
|
||||||
|
"Views",
|
||||||
|
"tsconfig.json",
|
||||||
|
"tsd.json",
|
||||||
|
"web.config",
|
||||||
|
"webpack.*.js",
|
||||||
|
"wwwroot"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": [
|
||||||
|
"npm install",
|
||||||
|
"gulp"
|
||||||
|
],
|
||||||
|
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ export class AlbumDeletePrompt {
|
|||||||
public show(album: models.Album) {
|
public show(album: models.Album) {
|
||||||
this.album = album;
|
this.album = album;
|
||||||
|
|
||||||
// Consider rewriting this using Angular's "Renderer" API so as to avoid direct DOM access
|
// Consider rewriting this using Angular 2's "Renderer" API so as to avoid direct DOM access
|
||||||
(<any>window).jQuery(".modal", this._elementRef.nativeElement).modal();
|
(<any>window).jQuery(".modal", this._elementRef.nativeElement).modal();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<Import Project="..\..\..\build\dependencies.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp1.1</TargetFramework>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
<OutputType>exe</OutputType>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.NodeServices\Microsoft.AspNetCore.NodeServices.csproj" />
|
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.NodeServices.Sockets\Microsoft.AspNetCore.NodeServices.Sockets.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="$(AspNetCoreVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
19
samples/misc/LatencyTest/LatencyTest.xproj
Normal file
19
samples/misc/LatencyTest/LatencyTest.xproj
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0.25123" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0.25123</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>a64af9d9-72aa-4433-be1d-dc2524b6808a</ProjectGuid>
|
||||||
|
<RootNamespace>LatencyTest</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
20
samples/misc/LatencyTest/project.json
Executable file
20
samples/misc/LatencyTest/project.json
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"version": "1.0.0-*",
|
||||||
|
"buildOptions": {
|
||||||
|
"emitEntryPoint": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"type": "platform"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.NodeServices": "1.1.0-*",
|
||||||
|
"Microsoft.AspNetCore.NodeServices.Sockets": "1.1.0-*",
|
||||||
|
"Microsoft.Extensions.DependencyInjection": "1.1.0"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netcoreapp1.0": {
|
||||||
|
"imports": "dnxcore50"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.NodeServices;
|
|
||||||
|
|
||||||
namespace NodeServicesExamples.Controllers
|
namespace NodeServicesExamples.Controllers
|
||||||
{
|
{
|
||||||
@@ -16,21 +15,8 @@ namespace NodeServicesExamples.Controllers
|
|||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IActionResult> Chart([FromServices] INodeServices nodeServices)
|
public IActionResult ImageResizing()
|
||||||
{
|
{
|
||||||
var options = new { width = 400, height = 200, showArea = true, showPoint = true, fullWidth = true };
|
|
||||||
var data = new
|
|
||||||
{
|
|
||||||
labels = new[] { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" },
|
|
||||||
series = new[] {
|
|
||||||
new[] { 1, 5, 2, 5, 4, 3 },
|
|
||||||
new[] { 2, 3, 4, 8, 1, 2 },
|
|
||||||
new[] { 5, 4, 3, 2, 1, 0 }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
ViewData["ChartMarkup"] = await nodeServices.InvokeAsync<string>("./Node/renderChart", "line", options, data);
|
|
||||||
|
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
64
samples/misc/NodeServicesExamples/Controllers/ResizeImage.cs
Normal file
64
samples/misc/NodeServicesExamples/Controllers/ResizeImage.cs
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.NodeServices;
|
||||||
|
using Microsoft.AspNetCore.StaticFiles;
|
||||||
|
|
||||||
|
namespace NodeServicesExamples.Controllers
|
||||||
|
{
|
||||||
|
public class ResizeImageController : Controller
|
||||||
|
{
|
||||||
|
private const int MaxDimension = 1000;
|
||||||
|
private static string[] AllowedMimeTypes = new[] { "image/jpeg", "image/png", "image/gif" };
|
||||||
|
|
||||||
|
private IHostingEnvironment _environment;
|
||||||
|
private INodeServices _nodeServices;
|
||||||
|
|
||||||
|
public ResizeImageController(IHostingEnvironment environment, INodeServices nodeServices)
|
||||||
|
{
|
||||||
|
_environment = environment;
|
||||||
|
_nodeServices = nodeServices;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Route("resize/{*imagePath}")]
|
||||||
|
public async Task<IActionResult> Index(string imagePath, int maxWidth, int maxHeight)
|
||||||
|
{
|
||||||
|
// Validate incoming params
|
||||||
|
if (maxWidth < 0 || maxHeight < 0 || maxWidth > MaxDimension || maxHeight > MaxDimension
|
||||||
|
|| (maxWidth + maxHeight) == 0)
|
||||||
|
{
|
||||||
|
return BadRequest("Invalid dimensions");
|
||||||
|
}
|
||||||
|
|
||||||
|
var mimeType = GetContentType(imagePath);
|
||||||
|
if (Array.IndexOf(AllowedMimeTypes, mimeType) < 0)
|
||||||
|
{
|
||||||
|
return BadRequest("Disallowed image format");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Locate source image on disk
|
||||||
|
var fileInfo = _environment.WebRootFileProvider.GetFileInfo(imagePath);
|
||||||
|
if (!fileInfo.Exists)
|
||||||
|
{
|
||||||
|
return NotFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke Node and pipe the result to the response
|
||||||
|
var imageStream = await _nodeServices.InvokeAsync<Stream>(
|
||||||
|
"./Node/resizeImage",
|
||||||
|
fileInfo.PhysicalPath,
|
||||||
|
mimeType,
|
||||||
|
maxWidth,
|
||||||
|
maxHeight);
|
||||||
|
return File(imageStream, mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetContentType(string path)
|
||||||
|
{
|
||||||
|
string result;
|
||||||
|
return new FileExtensionContentTypeProvider().TryGetContentType(path, out result) ? result : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
var generate = require('node-chartist');
|
|
||||||
|
|
||||||
module.exports = function (callback, type, options, data) {
|
|
||||||
generate(type, options, data).then(
|
|
||||||
result => callback(null, result), // Success case
|
|
||||||
error => callback(error) // Error case
|
|
||||||
);
|
|
||||||
};
|
|
||||||
8
samples/misc/NodeServicesExamples/Node/resizeImage.js
Normal file
8
samples/misc/NodeServicesExamples/Node/resizeImage.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
var sharp = require('sharp');
|
||||||
|
|
||||||
|
module.exports = function(result, physicalPath, mimeType, maxWidth, maxHeight) {
|
||||||
|
// Invoke the 'sharp' NPM module, and have it pipe the resulting image data back to .NET
|
||||||
|
sharp(physicalPath)
|
||||||
|
.resize(maxWidth || null, maxHeight || null)
|
||||||
|
.pipe(result.stream);
|
||||||
|
}
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<Import Project="..\..\..\build\dependencies.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp1.1</TargetFramework>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.NodeServices\Microsoft.AspNetCore.NodeServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="$(AspNetCoreVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
20
samples/misc/NodeServicesExamples/NodeServicesExamples.xproj
Normal file
20
samples/misc/NodeServicesExamples/NodeServicesExamples.xproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>6d4bcdd6-7951-449b-be55-cb7f014b7430</ProjectGuid>
|
||||||
|
<RootNamespace>NodeServicesExamples</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\..\JavaScriptServices.sln\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<DevelopmentServerPort>2018</DevelopmentServerPort>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<h1>Server-rendered chart</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This sample demonstrates how arbitrary NPM modules can be invoked from .NET code.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
In this case, we use <code>node-chartist</code> to render the following chart on the server. The output is
|
|
||||||
identical to what you'd get if you used <a href='https://gionkunz.github.io/chartist-js/'>chartist.js</a>
|
|
||||||
on the client, except that in this example, we're not executing any client-side code at all.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
@Html.Raw(ViewData["ChartMarkup"])
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<h1>Image Resizing</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This sample shows how the NPM module <a href="https://www.npmjs.com/package/sharp"><code>sharp</code></a>
|
||||||
|
can be used for dynamic image resizing from within an ASP.NET Core application. There is one copy of the
|
||||||
|
following image on disk, but we can set up an MVC action method that returns it resized to fit within an
|
||||||
|
arbitrary width and height.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Dependencies:</strong> On Windows and Linux, there are no native dependencies. Just running
|
||||||
|
<code>npm install</code> is enough. On OS X, however, you need to have <code>libvips</code> installed,
|
||||||
|
which you can get through <a href="http://brew.sh/">Homebrew</a> by running
|
||||||
|
<code>brew install homebrew/science/vips</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3>100px wide [<a href="/resize/images/parrot.jpg?maxWidth=100">open</a>]</h3>
|
||||||
|
<img src="/resize/images/parrot.jpg?maxWidth=100" />
|
||||||
|
|
||||||
|
<h3>200px wide [<a href="/resize/images/parrot.jpg?maxWidth=200">open</a>]</h3>
|
||||||
|
<img src="/resize/images/parrot.jpg?maxWidth=200" />
|
||||||
|
|
||||||
|
<h3>400px wide [<a href="/resize/images/parrot.jpg?maxWidth=400">open</a>]</h3>
|
||||||
|
<img src="/resize/images/parrot.jpg?maxWidth=400" />
|
||||||
|
|
||||||
|
<h3>800px wide [<a href="/resize/images/parrot.jpg?maxWidth=800">open</a>]</h3>
|
||||||
|
<img src="/resize/images/parrot.jpg?maxWidth=800" />
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>Credit:</strong>
|
||||||
|
<em><a href="https://www.flickr.com/photos/dcoetzee/3572948635">Parrot</a>
|
||||||
|
by <a href="https://www.flickr.com/photos/dcoetzee/">D Coetzee</a>
|
||||||
|
is dedicated to the <a href="http://creativecommons.org/publicdomain/zero/1.0/">public domain (CC0)</a></em>
|
||||||
|
</p>
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a asp-action="ES2015Transpilation">ES2015 transpilation</a></li>
|
<li><a asp-action="ES2015Transpilation">ES2015 transpilation</a>
|
||||||
<li><a asp-action="Chart">Server-side chart rendering</a></li>
|
<li><a asp-action="ImageResizing">Image resizing</a>
|
||||||
</ul>
|
</li>
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>NodeServices Examples</title>
|
<title>NodeServices Examples</title>
|
||||||
<link rel="stylesheet" href="~/css/chartist.min.css" />
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@RenderBody()
|
@RenderBody()
|
||||||
|
|||||||
@@ -4,6 +4,6 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"babel-core": "^6.7.4",
|
"babel-core": "^6.7.4",
|
||||||
"babel-preset-es2015": "^6.6.0",
|
"babel-preset-es2015": "^6.6.0",
|
||||||
"node-chartist": "^1.0.2"
|
"sharp": "^0.15.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
43
samples/misc/NodeServicesExamples/project.json
Executable file
43
samples/misc/NodeServicesExamples/project.json
Executable file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"version": "1.0.0-*",
|
||||||
|
"tooling": {
|
||||||
|
"defaultNamespace": "NodeServicesExamples"
|
||||||
|
},
|
||||||
|
"buildOptions": {
|
||||||
|
"emitEntryPoint": true,
|
||||||
|
"preserveCompilationContext": true
|
||||||
|
},
|
||||||
|
"runtimeOptions": {
|
||||||
|
"gcServer": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"type": "platform"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Mvc": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Mvc.TagHelpers": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.Json": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Console": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Debug": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.NodeServices": "1.1.0-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netcoreapp1.0": {}
|
||||||
|
},
|
||||||
|
"publishExclude": [
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"**.xproj",
|
||||||
|
"**.user",
|
||||||
|
"**.vspscc"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": [ "npm install" ],
|
||||||
|
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
BIN
samples/misc/NodeServicesExamples/wwwroot/images/parrot.jpg
Normal file
BIN
samples/misc/NodeServicesExamples/wwwroot/images/parrot.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 MiB |
4
samples/misc/Webpack/.gitignore
vendored
4
samples/misc/Webpack/.gitignore
vendored
@@ -43,6 +43,10 @@ TestResult.xml
|
|||||||
[Rr]eleasePS/
|
[Rr]eleasePS/
|
||||||
dlldata.c
|
dlldata.c
|
||||||
|
|
||||||
|
# DNX
|
||||||
|
project.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
*_i.c
|
*_i.c
|
||||||
*_p.c
|
*_p.c
|
||||||
*_i.h
|
*_i.h
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ export default function (params: any): Promise<{ html: string, globals?: any }>
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
// Here, you could put any logic that synchronously or asynchronously prerenders
|
// Here, you could put any logic that synchronously or asynchronously prerenders
|
||||||
// your SPA components. For example, see the boot-server.ts files in the AngularSpa
|
// your SPA components. For example, see the boot-server.ts files in the Angular2Spa
|
||||||
// and ReactReduxSpa templates for ways to prerender Angular and React components.
|
// and ReactReduxSpa templates for ways to prerender Angular 2 and React components.
|
||||||
//
|
//
|
||||||
// If you wanted, you could use a property on the 'params.data' object to specify
|
// If you wanted, you could use a property on the 'params.data' object to specify
|
||||||
// which SPA component or template to render.
|
// which SPA component or template to render.
|
||||||
|
|||||||
11
samples/misc/Webpack/Dockerfile
Normal file
11
samples/misc/Webpack/Dockerfile
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
FROM microsoft/aspnet:1.0.0-rc1-update1
|
||||||
|
|
||||||
|
RUN printf "deb http://ftp.us.debian.org/debian jessie main\n" >> /etc/apt/sources.list
|
||||||
|
RUN apt-get -qq update && apt-get install -qqy sqlite3 libsqlite3-dev && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY . /app
|
||||||
|
WORKDIR /app
|
||||||
|
RUN ["dnu", "restore"]
|
||||||
|
|
||||||
|
EXPOSE 5000/tcp
|
||||||
|
ENTRYPOINT ["dnx", "-p", "project.json", "web"]
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<Import Project="..\..\..\build\dependencies.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp1.1</TargetFramework>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.SpaServices\Microsoft.AspNetCore.SpaServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="$(AspNetCoreVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
20
samples/misc/Webpack/Webpack.xproj
Normal file
20
samples/misc/Webpack/Webpack.xproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>a8905301-8492-42fd-9e83-f715a0fdc3a2</ProjectGuid>
|
||||||
|
<RootNamespace>Webpack</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\..\JavaScriptServices.sln\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<DevelopmentServerPort>2018</DevelopmentServerPort>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
45
samples/misc/Webpack/project.json
Executable file
45
samples/misc/Webpack/project.json
Executable file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"version": "1.0.0-*",
|
||||||
|
"buildOptions": {
|
||||||
|
"emitEntryPoint": true,
|
||||||
|
"preserveCompilationContext": true
|
||||||
|
},
|
||||||
|
"runtimeOptions": {
|
||||||
|
"gcServer": true
|
||||||
|
},
|
||||||
|
"tooling": {
|
||||||
|
"defaultNamespace": "Webpack"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"type": "platform"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Mvc": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Mvc.TagHelpers": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.Json": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Console": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Debug": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.SpaServices": "1.1.0-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netcoreapp1.0": {}
|
||||||
|
},
|
||||||
|
"publishOptions": {
|
||||||
|
"exclude": [
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"**.xproj",
|
||||||
|
"**.user",
|
||||||
|
"**.vspscc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": [ "npm install" ],
|
||||||
|
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<Import Project="..\..\..\build\dependencies.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp1.1</TargetFramework>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Remove="node_modules\**\*" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.ReactServices\Microsoft.AspNetCore.ReactServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SQLite" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="AutoMapper" Version="$(AutoMapperVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
<Exec Command="node node_modules/webpack/bin/webpack.js" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="$(AspNetCoreToolsVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
20
samples/react/MusicStore/MusicStore.xproj
Normal file
20
samples/react/MusicStore/MusicStore.xproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>c870a92c-9e3f-4bf2-82b8-5758545a8b7c</ProjectGuid>
|
||||||
|
<RootNamespace>MusicStore</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\..\JavaScriptServices.sln\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<DevelopmentServerPort>2018</DevelopmentServerPort>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
80
samples/react/MusicStore/project.json
Executable file
80
samples/react/MusicStore/project.json
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"type": "platform"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.ReactServices": "1.1.0-*",
|
||||||
|
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Mvc": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Razor.Tools": {
|
||||||
|
"version": "1.0.0-preview2-final",
|
||||||
|
"type": "build"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.StaticFiles": "1.1.0",
|
||||||
|
"Microsoft.EntityFrameworkCore.SQLite": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.Json": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Configuration.CommandLine": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Console": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Debug": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
|
||||||
|
"AutoMapper": "5.0.2"
|
||||||
|
},
|
||||||
|
|
||||||
|
"tools": {
|
||||||
|
"Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
|
||||||
|
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
|
||||||
|
"Microsoft.DotNet.Watcher.Tools": "1.0.0-preview2-final"
|
||||||
|
},
|
||||||
|
|
||||||
|
"frameworks": {
|
||||||
|
"netcoreapp1.0": {
|
||||||
|
"imports": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"buildOptions": {
|
||||||
|
"emitEntryPoint": true,
|
||||||
|
"preserveCompilationContext": true,
|
||||||
|
"compile": {
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"runtimeOptions": {
|
||||||
|
"configProperties": {
|
||||||
|
"System.GC.Server": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"publishOptions": {
|
||||||
|
"include": [
|
||||||
|
"appsettings.json",
|
||||||
|
"ClientApp/dist",
|
||||||
|
"node_modules",
|
||||||
|
"Views",
|
||||||
|
"web.config",
|
||||||
|
"wwwroot"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"wwwroot/dist/*.map"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": [
|
||||||
|
"npm install",
|
||||||
|
"node node_modules/webpack/bin/webpack.js"
|
||||||
|
],
|
||||||
|
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
|
||||||
|
},
|
||||||
|
|
||||||
|
"tooling": {
|
||||||
|
"defaultNamespace": "MusicStore"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
samples/react/ReactGrid/.gitignore
vendored
1
samples/react/ReactGrid/.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
/node_modules/
|
/node_modules/
|
||||||
|
project.lock.json
|
||||||
/wwwroot/dist/
|
/wwwroot/dist/
|
||||||
/Properties/launchSettings.json
|
/Properties/launchSettings.json
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<Import Project="..\..\..\build\dependencies.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp1.1</TargetFramework>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
<IsPackable>false</IsPackable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.ReactServices\Microsoft.AspNetCore.ReactServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(AspNetCoreVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
20
samples/react/ReactGrid/ReactGrid.xproj
Normal file
20
samples/react/ReactGrid/ReactGrid.xproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>abf90a5b-f4e0-438c-a6e4-9549fb43690b</ProjectGuid>
|
||||||
|
<RootNamespace>ReactGrid</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<DevelopmentServerPort>2311</DevelopmentServerPort>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
37
samples/react/ReactGrid/project.json
Executable file
37
samples/react/ReactGrid/project.json
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"version": "1.0.0-*",
|
||||||
|
"buildOptions": {
|
||||||
|
"emitEntryPoint": true,
|
||||||
|
"preserveCompilationContext": true
|
||||||
|
},
|
||||||
|
"runtimeOptions": {
|
||||||
|
"gcServer": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"type": "platform"
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.ReactServices": "1.1.0-*",
|
||||||
|
"Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.StaticFiles": "1.1.0"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netcoreapp1.0": {}
|
||||||
|
},
|
||||||
|
"publishOptions": {
|
||||||
|
"exclude": [
|
||||||
|
"node_modules",
|
||||||
|
"bower_components",
|
||||||
|
"**.xproj",
|
||||||
|
"**.user",
|
||||||
|
"**.vspscc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": [ "npm install" ],
|
||||||
|
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<Import Project="..\..\build\common.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<Description>Helpers for building Angular applications on ASP.NET Core.</Description>
|
|
||||||
<TargetFrameworks>net451;netstandard1.6</TargetFrameworks>
|
|
||||||
<PackageTags>aspnetcore;aspnetcoremvc;nodeservices</PackageTags>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.SpaServices\Microsoft.AspNetCore.SpaServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="$(AspNetCoreVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>421807e6-b62c-417b-b901-46c5dedaa8f1</ProjectGuid>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.AngularServices</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
@@ -10,7 +10,7 @@ using Newtonsoft.Json;
|
|||||||
namespace Microsoft.AspNetCore.AngularServices
|
namespace Microsoft.AspNetCore.AngularServices
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helpers for prepopulating Angular's 'http' service with data.
|
/// Helpers for prepopulating Angular 2's 'http' service with data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class PrimeCacheHelper
|
public static class PrimeCacheHelper
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Resources;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: AssemblyMetadata("Serviceable", "True")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en-us")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft Corporation.")]
|
||||||
|
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
|
||||||
|
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
|
||||||
28
src/Microsoft.AspNetCore.AngularServices/project.json
Normal file
28
src/Microsoft.AspNetCore.AngularServices/project.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"description": "Helpers for building Angular 2 applications on ASP.NET Core.",
|
||||||
|
"version": "1.1.0-beta2-*",
|
||||||
|
"packOptions": {
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/aspnet/javascriptservices"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"aspnetcore",
|
||||||
|
"aspnetcoremvc",
|
||||||
|
"nodeservices"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"buildOptions": {
|
||||||
|
"warningsAsErrors": true,
|
||||||
|
"keyFile": "../../tools/Key.snk",
|
||||||
|
"xmlDoc": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNetCore.Mvc.TagHelpers": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.SpaServices": "1.1.0-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net451": {},
|
||||||
|
"netstandard1.6": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<Import Project="..\..\build\common.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<Description>Socket-based RPC for Microsoft.AspNetCore.NodeServices.</Description>
|
|
||||||
<TargetFrameworks>net451;netstandard1.6</TargetFrameworks>
|
|
||||||
<PackageTags>aspnetcore;aspnetcoremvc;nodeservices</PackageTags>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="Content\**\*" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.NodeServices\Microsoft.AspNetCore.NodeServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
|
|
||||||
<PackageReference Include="Microsoft.Tpl.Dataflow" Version="$(MicrosoftDataflowVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.6' ">
|
|
||||||
<PackageReference Include="System.IO.Pipes" Version="$(CoreFxVersion)" />
|
|
||||||
<PackageReference Include="System.Threading.Tasks.Dataflow" Version="$(ThreadingDataflowVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
<Exec Command="node node_modules/webpack/bin/webpack.js" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Resources;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: AssemblyMetadata("Serviceable", "True")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en-us")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft Corporation.")]
|
||||||
|
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
|
||||||
|
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
|
||||||
@@ -62,15 +62,11 @@ namespace Microsoft.AspNetCore.NodeServices.Sockets
|
|||||||
{
|
{
|
||||||
if (_connectionHasFailed)
|
if (_connectionHasFailed)
|
||||||
{
|
{
|
||||||
// _connectionHasFailed implies a protocol-level error. The old instance is no longer of any use.
|
|
||||||
var allowConnectionDraining = false;
|
|
||||||
|
|
||||||
// This special exception type forces NodeServicesImpl to restart the Node instance
|
// This special exception type forces NodeServicesImpl to restart the Node instance
|
||||||
throw new NodeInvocationException(
|
throw new NodeInvocationException(
|
||||||
"The SocketNodeInstance socket connection failed. See logs to identify the reason.",
|
"The SocketNodeInstance socket connection failed. See logs to identify the reason.",
|
||||||
details: null,
|
null,
|
||||||
nodeInstanceUnavailable: true,
|
nodeInstanceUnavailable: true);
|
||||||
allowConnectionDraining: allowConnectionDraining);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_virtualConnectionClient == null)
|
if (_virtualConnectionClient == null)
|
||||||
@@ -179,7 +175,6 @@ namespace Microsoft.AspNetCore.NodeServices.Sockets
|
|||||||
using (var jsonWriter = new JsonTextWriter(streamWriter))
|
using (var jsonWriter = new JsonTextWriter(streamWriter))
|
||||||
{
|
{
|
||||||
jsonWriter.CloseOutput = false;
|
jsonWriter.CloseOutput = false;
|
||||||
jsonWriter.AutoCompleteOnClose = false;
|
|
||||||
|
|
||||||
var serializer = JsonSerializer.Create(jsonSerializerSettings);
|
var serializer = JsonSerializer.Create(jsonSerializerSettings);
|
||||||
serializer.Serialize(jsonWriter, serializableObject);
|
serializer.Serialize(jsonWriter, serializableObject);
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ const parsedArgs = parseArgs(process.argv);
|
|||||||
const listenAddress = (useWindowsNamedPipes ? '\\\\.\\pipe\\' : '/tmp/') + parsedArgs.listenAddress;
|
const listenAddress = (useWindowsNamedPipes ? '\\\\.\\pipe\\' : '/tmp/') + parsedArgs.listenAddress;
|
||||||
server.listen(listenAddress);
|
server.listen(listenAddress);
|
||||||
|
|
||||||
exitWhenParentExits(parseInt(parsedArgs.parentPid), /* ignoreSigint */ true);
|
exitWhenParentExits(parseInt(parsedArgs.parentPid));
|
||||||
|
|
||||||
interface RpcInvocation {
|
interface RpcInvocation {
|
||||||
moduleName: string;
|
moduleName: string;
|
||||||
|
|||||||
39
src/Microsoft.AspNetCore.NodeServices.Sockets/project.json
Normal file
39
src/Microsoft.AspNetCore.NodeServices.Sockets/project.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"description": "Socket-based RPC for Microsoft.AspNetCore.NodeServices",
|
||||||
|
"version": "1.1.0-beta2-*",
|
||||||
|
"packOptions": {
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/aspnet/javascriptservices"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"aspnetcore",
|
||||||
|
"aspnetcoremvc",
|
||||||
|
"nodeservices"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"buildOptions": {
|
||||||
|
"warningsAsErrors": true,
|
||||||
|
"keyFile": "../../tools/Key.snk",
|
||||||
|
"embed": [
|
||||||
|
"Content/**/*"
|
||||||
|
],
|
||||||
|
"xmlDoc": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNetCore.NodeServices": "1.1.0-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net451": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Tpl.Dataflow": "4.5.24"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"netstandard1.6": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.IO.Pipes": "4.3.0",
|
||||||
|
"System.Threading.Tasks.Dataflow": "4.7.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,13 +13,6 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool NodeInstanceUnavailable { get; private set; }
|
public bool NodeInstanceUnavailable { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If true, indicates that even though the invocation failed because the Node.js instance could not be reached
|
|
||||||
/// or needs to be restarted, that Node.js instance may remain alive for a period in order to complete any
|
|
||||||
/// outstanding requests.
|
|
||||||
/// </summary>
|
|
||||||
public bool AllowConnectionDraining { get; private set;}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new instance of <see cref="NodeInvocationException"/>.
|
/// Creates a new instance of <see cref="NodeInvocationException"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -36,20 +29,10 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
/// <param name="message">A description of the exception.</param>
|
/// <param name="message">A description of the exception.</param>
|
||||||
/// <param name="details">Additional information, such as a Node.js stack trace, representing the exception.</param>
|
/// <param name="details">Additional information, such as a Node.js stack trace, representing the exception.</param>
|
||||||
/// <param name="nodeInstanceUnavailable">Specifies a value for the <see cref="NodeInstanceUnavailable"/> flag.</param>
|
/// <param name="nodeInstanceUnavailable">Specifies a value for the <see cref="NodeInstanceUnavailable"/> flag.</param>
|
||||||
/// <param name="allowConnectionDraining">Specifies a value for the <see cref="AllowConnectionDraining"/> flag.</param>
|
public NodeInvocationException(string message, string details, bool nodeInstanceUnavailable)
|
||||||
public NodeInvocationException(string message, string details, bool nodeInstanceUnavailable, bool allowConnectionDraining)
|
|
||||||
: this(message, details)
|
: this(message, details)
|
||||||
{
|
{
|
||||||
// Reject a meaningless combination of flags
|
|
||||||
if (allowConnectionDraining && !nodeInstanceUnavailable)
|
|
||||||
{
|
|
||||||
throw new ArgumentException(
|
|
||||||
$"The '${ nameof(allowConnectionDraining) }' parameter cannot be true " +
|
|
||||||
$"unless the '${ nameof(nodeInstanceUnavailable) }' parameter is also true.");
|
|
||||||
}
|
|
||||||
|
|
||||||
NodeInstanceUnavailable = nodeInstanceUnavailable;
|
NodeInstanceUnavailable = nodeInstanceUnavailable;
|
||||||
AllowConnectionDraining = allowConnectionDraining;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,12 +27,21 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
protected readonly ILogger OutputLogger;
|
protected readonly ILogger OutputLogger;
|
||||||
|
|
||||||
private const string ConnectionEstablishedMessage = "[Microsoft.AspNetCore.NodeServices:Listening]";
|
private const string ConnectionEstablishedMessage = "[Microsoft.AspNetCore.NodeServices:Listening]";
|
||||||
|
private const string DebuggingStartedMessageFormat = @"-----
|
||||||
|
*** Node.js debugging is enabled ***
|
||||||
|
{0}
|
||||||
|
|
||||||
|
To debug, run:
|
||||||
|
node-inspector{1}
|
||||||
|
|
||||||
|
If you haven't yet installed node-inspector, you can do so as follows:
|
||||||
|
npm install -g node-inspector
|
||||||
|
-----";
|
||||||
private readonly TaskCompletionSource<object> _connectionIsReadySource = new TaskCompletionSource<object>();
|
private readonly TaskCompletionSource<object> _connectionIsReadySource = new TaskCompletionSource<object>();
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
private readonly StringAsTempFile _entryPointScript;
|
private readonly StringAsTempFile _entryPointScript;
|
||||||
private FileSystemWatcher _fileSystemWatcher;
|
private FileSystemWatcher _fileSystemWatcher;
|
||||||
private int _invocationTimeoutMilliseconds;
|
private int _invocationTimeoutMilliseconds;
|
||||||
private bool _launchWithDebugging;
|
|
||||||
private readonly Process _nodeProcess;
|
private readonly Process _nodeProcess;
|
||||||
private int? _nodeDebuggingPort;
|
private int? _nodeDebuggingPort;
|
||||||
private bool _nodeProcessNeedsRestart;
|
private bool _nodeProcessNeedsRestart;
|
||||||
@@ -69,10 +78,9 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
OutputLogger = nodeOutputLogger;
|
OutputLogger = nodeOutputLogger;
|
||||||
_entryPointScript = new StringAsTempFile(entryPointScript);
|
_entryPointScript = new StringAsTempFile(entryPointScript);
|
||||||
_invocationTimeoutMilliseconds = invocationTimeoutMilliseconds;
|
_invocationTimeoutMilliseconds = invocationTimeoutMilliseconds;
|
||||||
_launchWithDebugging = launchWithDebugging;
|
|
||||||
|
|
||||||
var startInfo = PrepareNodeProcessStartInfo(_entryPointScript.FileName, projectPath, commandLineArguments,
|
var startInfo = PrepareNodeProcessStartInfo(_entryPointScript.FileName, projectPath, commandLineArguments,
|
||||||
environmentVars, _launchWithDebugging, debuggingPort);
|
environmentVars, launchWithDebugging, debuggingPort);
|
||||||
_nodeProcess = LaunchNodeProcess(startInfo);
|
_nodeProcess = LaunchNodeProcess(startInfo);
|
||||||
_watchFileExtensions = watchFileExtensions;
|
_watchFileExtensions = watchFileExtensions;
|
||||||
_fileSystemWatcher = BeginFileWatcher(projectPath);
|
_fileSystemWatcher = BeginFileWatcher(projectPath);
|
||||||
@@ -95,17 +103,10 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
{
|
{
|
||||||
// This special kind of exception triggers a transparent retry - NodeServicesImpl will launch
|
// This special kind of exception triggers a transparent retry - NodeServicesImpl will launch
|
||||||
// a new Node instance and pass the invocation to that one instead.
|
// a new Node instance and pass the invocation to that one instead.
|
||||||
// Note that if the Node process is listening for debugger connections, then we need it to shut
|
|
||||||
// down immediately and not stay open for connection draining (because if it did, the new Node
|
|
||||||
// instance wouldn't able to start, because the old one would still hold the debugging port).
|
|
||||||
var message = _nodeProcess.HasExited
|
var message = _nodeProcess.HasExited
|
||||||
? "The Node process has exited"
|
? "The Node process has exited"
|
||||||
: "The Node process needs to restart";
|
: "The Node process needs to restart";
|
||||||
throw new NodeInvocationException(
|
throw new NodeInvocationException(message, null, nodeInstanceUnavailable: true);
|
||||||
message,
|
|
||||||
details: null,
|
|
||||||
nodeInstanceUnavailable: true,
|
|
||||||
allowConnectionDraining: !_launchWithDebugging);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct a new cancellation token that combines the supplied token with the configured invocation
|
// Construct a new cancellation token that combines the supplied token with the configured invocation
|
||||||
@@ -205,8 +206,8 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
/// <param name="projectPath">The root path of the project. This is used when locating Node.js modules relative to the project root.</param>
|
/// <param name="projectPath">The root path of the project. This is used when locating Node.js modules relative to the project root.</param>
|
||||||
/// <param name="commandLineArguments">Command-line arguments to be passed to the Node.js process.</param>
|
/// <param name="commandLineArguments">Command-line arguments to be passed to the Node.js process.</param>
|
||||||
/// <param name="environmentVars">Environment variables to be set on the Node.js process.</param>
|
/// <param name="environmentVars">Environment variables to be set on the Node.js process.</param>
|
||||||
/// <param name="launchWithDebugging">If true, passes a flag to the Node.js process telling it to accept V8 Inspector connections.</param>
|
/// <param name="launchWithDebugging">If true, passes a flag to the Node.js process telling it to accept V8 debugger connections.</param>
|
||||||
/// <param name="debuggingPort">If debugging is enabled, the Node.js process should listen for V8 Inspector connections on this port.</param>
|
/// <param name="debuggingPort">If debugging is enabled, the Node.js process should listen for V8 debugger connections on this port.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
protected virtual ProcessStartInfo PrepareNodeProcessStartInfo(
|
protected virtual ProcessStartInfo PrepareNodeProcessStartInfo(
|
||||||
string entryPointFilename, string projectPath, string commandLineArguments,
|
string entryPointFilename, string projectPath, string commandLineArguments,
|
||||||
@@ -216,7 +217,7 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
string debuggingArgs;
|
string debuggingArgs;
|
||||||
if (launchWithDebugging)
|
if (launchWithDebugging)
|
||||||
{
|
{
|
||||||
debuggingArgs = debuggingPort != default(int) ? $"--inspect={debuggingPort} " : "--inspect ";
|
debuggingArgs = debuggingPort != default(int) ? $"--debug={debuggingPort} " : "--debug ";
|
||||||
_nodeDebuggingPort = debuggingPort;
|
_nodeDebuggingPort = debuggingPort;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -379,9 +380,10 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
{
|
{
|
||||||
if (evt.Data != null)
|
if (evt.Data != null)
|
||||||
{
|
{
|
||||||
if (_launchWithDebugging && IsDebuggerMessage(evt.Data))
|
if (IsDebuggerListeningMessage(evt.Data))
|
||||||
{
|
{
|
||||||
OutputLogger.LogWarning(evt.Data);
|
var debugPortArg = _nodeDebuggingPort.HasValue ? $" --debug-port={_nodeDebuggingPort.Value}" : string.Empty;
|
||||||
|
OutputLogger.LogWarning(string.Format(DebuggingStartedMessageFormat, evt.Data, debugPortArg));
|
||||||
}
|
}
|
||||||
else if (!initializationIsCompleted)
|
else if (!initializationIsCompleted)
|
||||||
{
|
{
|
||||||
@@ -400,12 +402,9 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
_nodeProcess.BeginErrorReadLine();
|
_nodeProcess.BeginErrorReadLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsDebuggerMessage(string message)
|
private static bool IsDebuggerListeningMessage(string message)
|
||||||
{
|
{
|
||||||
return message.StartsWith("Debugger attached", StringComparison.OrdinalIgnoreCase) ||
|
return message.StartsWith("Debugger listening ", StringComparison.OrdinalIgnoreCase);
|
||||||
message.StartsWith("Debugger listening ", StringComparison.OrdinalIgnoreCase) ||
|
|
||||||
message.StartsWith("To start debugging", StringComparison.OrdinalIgnoreCase) ||
|
|
||||||
message.Contains("chrome-devtools:");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private FileSystemWatcher BeginFileWatcher(string rootDir)
|
private FileSystemWatcher BeginFileWatcher(string rootDir)
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<Import Project="..\..\build\common.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<Description>Invoke Node.js modules at runtime in ASP.NET Core applications.</Description>
|
|
||||||
<TargetFrameworks>net451;netstandard1.6</TargetFrameworks>
|
|
||||||
<PackageTags>aspnetcore;aspnetcoremvc;nodeservices</PackageTags>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="Content\**\*" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(AspNetCoreVersion)" />
|
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="$(JsonNetVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.6' ">
|
|
||||||
<PackageReference Include="System.Diagnostics.Process" Version="$(CoreFxVersion)" />
|
|
||||||
<PackageReference Include="System.IO.FileSystem.Watcher" Version="$(CoreFxVersion)" />
|
|
||||||
<PackageReference Include="System.Runtime.Loader" Version="$(CoreFxVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
<Exec Command="node node_modules/webpack/bin/webpack.js" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>b0fa4175-8b29-4904-9780-28b3c24b0567</ProjectGuid>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.NodeServices</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\JavaScriptServices.sln\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
@@ -72,8 +72,7 @@ namespace Microsoft.AspNetCore.NodeServices
|
|||||||
{
|
{
|
||||||
if (_currentNodeInstance == nodeInstance)
|
if (_currentNodeInstance == nodeInstance)
|
||||||
{
|
{
|
||||||
var disposalDelay = ex.AllowConnectionDraining ? ConnectionDrainingTimespan : TimeSpan.Zero;
|
DisposeNodeInstance(_currentNodeInstance, delay: ConnectionDrainingTimespan);
|
||||||
DisposeNodeInstance(_currentNodeInstance, disposalDelay);
|
|
||||||
_currentNodeInstance = null;
|
_currentNodeInstance = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Resources;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: AssemblyMetadata("Serviceable", "True")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en-us")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft Corporation.")]
|
||||||
|
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
|
||||||
|
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
|
||||||
@@ -10,7 +10,7 @@ This NuGet package provides a fast and robust way to invoke Node.js code from a
|
|||||||
It is the underlying mechanism supporting the following packages:
|
It is the underlying mechanism supporting the following packages:
|
||||||
|
|
||||||
* [`Microsoft.AspNetCore.SpaServices`](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices) - builds on NodeServices, adding functionality commonly used in Single Page Applications, such as server-side prerendering, webpack middleware, and integration between server-side and client-side routing.
|
* [`Microsoft.AspNetCore.SpaServices`](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.SpaServices) - builds on NodeServices, adding functionality commonly used in Single Page Applications, such as server-side prerendering, webpack middleware, and integration between server-side and client-side routing.
|
||||||
* [`Microsoft.AspNetCore.AngularServices`](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.AngularServices) and [`Microsoft.AspNetCore.ReactServices`](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.ReactServices) - these build on `SpaServices`, adding helpers specific to Angular and React, such as cache priming and integrating server-side and client-side validation
|
* [`Microsoft.AspNetCore.AngularServices`](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.AngularServices) and [`Microsoft.AspNetCore.ReactServices`](https://github.com/aspnet/JavaScriptServices/tree/dev/src/Microsoft.AspNetCore.ReactServices) - these build on `SpaServices`, adding helpers specific to Angular 2 and React, such as cache priming and integrating server-side and client-side validation
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ For .NET Framework apps:
|
|||||||
|
|
||||||
* `nuget install Microsoft.AspNetCore.NodeServices`
|
* `nuget install Microsoft.AspNetCore.NodeServices`
|
||||||
|
|
||||||
### Do you just want to build an ASP.NET Core app with Angular / React / Knockout / etc.?
|
### Do you just want to build an ASP.NET Core app with Angular 2 / React / Knockout / etc.?
|
||||||
|
|
||||||
In that case, you don't need to use NodeServices directly (or install it manually). You can either:
|
In that case, you don't need to use NodeServices directly (or install it manually). You can either:
|
||||||
|
|
||||||
|
|||||||
45
src/Microsoft.AspNetCore.NodeServices/project.json
Normal file
45
src/Microsoft.AspNetCore.NodeServices/project.json
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"description": "Invoke Node.js modules at runtime in ASP.NET Core applications.",
|
||||||
|
"version": "1.1.0-rc1-*",
|
||||||
|
"packOptions": {
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/aspnet/javascriptservices"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"aspnetcore",
|
||||||
|
"aspnetcoremvc",
|
||||||
|
"nodeservices"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"buildOptions": {
|
||||||
|
"warningsAsErrors": true,
|
||||||
|
"keyFile": "../../tools/Key.snk",
|
||||||
|
"embed": [
|
||||||
|
"Content/**/*"
|
||||||
|
],
|
||||||
|
"xmlDoc": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNetCore.Hosting.Abstractions": "1.1.0",
|
||||||
|
"Microsoft.Extensions.Logging.Console": "1.1.0",
|
||||||
|
"Newtonsoft.Json": "9.0.1",
|
||||||
|
"NETStandard.Library": "1.6.1-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net451": {},
|
||||||
|
"netstandard1.6": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Diagnostics.Process": "4.3.0",
|
||||||
|
"System.IO.FileSystem.Watcher": "4.3.0",
|
||||||
|
"System.Runtime.Loader": "4.3.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": [
|
||||||
|
"npm install",
|
||||||
|
"node node_modules/webpack/bin/webpack.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<Import Project="..\..\build\common.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<Description>Helpers for building React applications on ASP.NET Core.</Description>
|
|
||||||
<TargetFrameworks>net451;netstandard1.6</TargetFrameworks>
|
|
||||||
<PackageTags>aspnetcore;aspnetcoremvc;nodeservices</PackageTags>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.SpaServices\Microsoft.AspNetCore.SpaServices.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="$(AspNetCoreVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>b04381de-991f-4831-a0b5-fe1bd3ef80c4</ProjectGuid>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.ReactServices</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Resources;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: AssemblyMetadata("Serviceable", "True")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en-us")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft Corporation.")]
|
||||||
|
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
|
||||||
|
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
|
||||||
28
src/Microsoft.AspNetCore.ReactServices/project.json
Normal file
28
src/Microsoft.AspNetCore.ReactServices/project.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"description": "Helpers for building React applications on ASP.NET Core.",
|
||||||
|
"version": "1.1.0-beta2-*",
|
||||||
|
"packOptions": {
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/aspnet/javascriptservices"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"aspnetcore",
|
||||||
|
"aspnetcoremvc",
|
||||||
|
"nodeservices"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"buildOptions": {
|
||||||
|
"warningsAsErrors": true,
|
||||||
|
"keyFile": "../../tools/Key.snk",
|
||||||
|
"xmlDoc": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNetCore.Mvc.TagHelpers": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.SpaServices": "1.1.0-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net451": {},
|
||||||
|
"netstandard1.6": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<Import Project="..\..\build\common.props" />
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<Description>Helpers for building single-page applications on ASP.NET MVC Core.</Description>
|
|
||||||
<TargetFrameworks>net451;netstandard1.6</TargetFrameworks>
|
|
||||||
<PackageTags>aspnetcore;aspnetcoremvc;nodeservices</PackageTags>
|
|
||||||
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="Content\**\*" />
|
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.NodeServices\Microsoft.AspNetCore.NodeServices.csproj" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="$(AspNetCoreVersion)" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
|
|
||||||
<Exec Command="npm install" />
|
|
||||||
<Exec Command="node node_modules/webpack/bin/webpack.js" />
|
|
||||||
</Target>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0.23107" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0.23107</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>4624f728-6dff-44b6-93b5-3c7d9c94bf3f</ProjectGuid>
|
||||||
|
<RootNamespace>Microsoft.AspNetCore.SpaServices</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
@@ -129,11 +129,6 @@ namespace Microsoft.AspNetCore.SpaServices.Prerendering
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.StatusCode.HasValue)
|
|
||||||
{
|
|
||||||
ViewContext.HttpContext.Response.StatusCode = result.StatusCode.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// It's some HTML to inject
|
// It's some HTML to inject
|
||||||
output.Content.SetHtmlContent(result.Html);
|
output.Content.SetHtmlContent(result.Html);
|
||||||
|
|
||||||
|
|||||||
@@ -25,10 +25,5 @@ namespace Microsoft.AspNetCore.SpaServices.Prerendering
|
|||||||
/// to the SPA's routing configuration.
|
/// to the SPA's routing configuration.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string RedirectUrl { get; set; }
|
public string RedirectUrl { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If set, specifies the HTTP status code that should be sent back with the server response.
|
|
||||||
/// </summary>
|
|
||||||
public int? StatusCode { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Resources;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: AssemblyMetadata("Serviceable", "True")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en-us")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft Corporation.")]
|
||||||
|
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
|
||||||
|
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
# Microsoft.AspNetCore.SpaServices
|
# Microsoft.AspNetCore.SpaServices
|
||||||
|
|
||||||
If you're building an ASP.NET Core application, and want to use Angular, React, Knockout, or another single-page app (SPA) framework, this NuGet package contains useful infrastructure for you.
|
If you're building an ASP.NET Core application, and want to use Angular 2, React, Knockout, or another single-page app (SPA) framework, this NuGet package contains useful infrastructure for you.
|
||||||
|
|
||||||
This package enables:
|
This package enables:
|
||||||
|
|
||||||
* [**Server-side prerendering**](#server-side-prerendering) for *universal* (a.k.a. *isomorphic*) applications, where your Angular / React / etc. components are first rendered on the server, and then transferred to the client where execution continues
|
* [**Server-side prerendering**](#server-side-prerendering) for *universal* (a.k.a. *isomorphic*) applications, where your Angular 2 / React / etc. components are first rendered on the server, and then transferred to the client where execution continues
|
||||||
* [**Webpack middleware**](#webpack-dev-middleware) so that, during development, any webpack-built resources will be generated on demand, without you having to run webpack manually or compile files to disk
|
* [**Webpack middleware**](#webpack-dev-middleware) so that, during development, any webpack-built resources will be generated on demand, without you having to run webpack manually or compile files to disk
|
||||||
* [**Hot module replacement**](#webpack-hot-module-replacement) so that, during development, your code and markup changes will be pushed to your browser and updated in the running application automatically, without even needing to reload the page
|
* [**Hot module replacement**](#webpack-hot-module-replacement) so that, during development, your code and markup changes will be pushed to your browser and updated in the running application automatically, without even needing to reload the page
|
||||||
* [**Routing helpers**](#routing-helper-mapspafallbackroute) for integrating server-side routing with client-side routing
|
* [**Routing helpers**](#routing-helper-mapspafallbackroute) for integrating server-side routing with client-side routing
|
||||||
@@ -42,9 +42,9 @@ Also, if you want to debug projects created with the aspnetcore-spa generator, s
|
|||||||
|
|
||||||
## Server-side prerendering
|
## Server-side prerendering
|
||||||
|
|
||||||
The `SpaServices` package isn't tied to any particular client-side framework, and it doesn't force you to set up your client-side application in any one particular style. So, `SpaServices` doesn't contain hard-coded logic for rendering Angular / React / etc. components.
|
The `SpaServices` package isn't tied to any particular client-side framework, and it doesn't force you to set up your client-side application in any one particular style. So, `SpaServices` doesn't contain hard-coded logic for rendering Angular 2 / React / etc. components.
|
||||||
|
|
||||||
Instead, what `SpaServices` offers is ASP.NET Core APIs that know how to invoke a JavaScript function that you supply, passing through context information that you'll need for server-side prerendering, and then injects the resulting HTML string into your rendered page. In this document, you'll find examples of setting this up to render Angular and React components.
|
Instead, what `SpaServices` offers is ASP.NET Core APIs that know how to invoke a JavaScript function that you supply, passing through context information that you'll need for server-side prerendering, and then injects the resulting HTML string into your rendered page. In this document, you'll find examples of setting this up to render Angular 2 and React components.
|
||||||
|
|
||||||
### 1. Enable the asp-prerender-* tag helpers
|
### 1. Enable the asp-prerender-* tag helpers
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ module.exports = prerendering.createServerRenderer(function(params) {
|
|||||||
|
|
||||||
If you try running your app now, you should see the HTML snippet generated by your JavaScript getting injected into your page.
|
If you try running your app now, you should see the HTML snippet generated by your JavaScript getting injected into your page.
|
||||||
|
|
||||||
As you can see, your JavaScript code receives context information (such as the URL being requested), and returns a `Promise` so that it can asynchronously supply the markup to be injected into the page. You can put whatever logic you like here, but typically you'll want to execute a component from your Angular / React / etc. application.
|
As you can see, your JavaScript code receives context information (such as the URL being requested), and returns a `Promise` so that it can asynchronously supply the markup to be injected into the page. You can put whatever logic you like here, but typically you'll want to execute a component from your Angular 2 / React / etc. application.
|
||||||
|
|
||||||
**Passing data from .NET code into JavaScript code**
|
**Passing data from .NET code into JavaScript code**
|
||||||
|
|
||||||
@@ -211,21 +211,21 @@ Finally, run `webpack` on the command line to build `ClientApp/dist/main-server.
|
|||||||
Webpack is a broad and powerful tool and can do far more than just invoke the TypeScript compiler. To learn more, see the [webpack website](https://webpack.github.io/).
|
Webpack is a broad and powerful tool and can do far more than just invoke the TypeScript compiler. To learn more, see the [webpack website](https://webpack.github.io/).
|
||||||
|
|
||||||
|
|
||||||
### 5(a). Prerendering Angular components
|
### 5(a). Prerendering Angular 2 components
|
||||||
|
|
||||||
If you're building an Angular application, you can run your components on the server inside your `boot-server.ts` file so they will be injected into the resulting web page.
|
If you're building an Angular 2 application, you can run your components on the server inside your `boot-server.ts` file so they will be injected into the resulting web page.
|
||||||
|
|
||||||
First install the NPM package `angular2-universal` - this contains infrastructure for executing Angular components inside Node.js:
|
First install the NPM package `angular2-universal` - this contains infrastructure for executing Angular 2 components inside Node.js:
|
||||||
|
|
||||||
```
|
```
|
||||||
npm install --save angular2-universal
|
npm install --save angular2-universal
|
||||||
```
|
```
|
||||||
|
|
||||||
Now you can use the [`angular2-universal` APIs](https://github.com/angular/universal) from your `boot-server.ts` TypeScript module to execute your Angular component on the server. The code needed for this is fairly complex, but that's unavoidable because Angular supports so many different ways of being configured, and you need to provide wiring for whatever combination of DI modules you're using.
|
Now you can use the [`angular2-universal` APIs](https://github.com/angular/universal) from your `boot-server.ts` TypeScript module to execute your Angular 2 component on the server. The code needed for this is fairly complex, but that's unavoidable because Angular 2 supports so many different ways of being configured, and you need to provide wiring for whatever combination of DI modules you're using.
|
||||||
|
|
||||||
You can find an example `boot-server.ts` that renders arbitrary Angular components [here](https://github.com/aspnet/JavaScriptServices/blob/dev/templates/AngularSpa/ClientApp/boot-server.ts). If you use this with your own application, you might need to edit the `serverBindings` array to reference any other DI services that your Angular component depends on.
|
You can find an example `boot-server.ts` that renders arbitrary Angular 2 components [here](https://github.com/aspnet/JavaScriptServices/blob/dev/templates/Angular2Spa/ClientApp/boot-server.ts). If you use this with your own application, you might need to edit the `serverBindings` array to reference any other DI services that your Angular 2 component depends on.
|
||||||
|
|
||||||
The easiest way to get started with Angular server-side rendering on ASP.NET Core is to use the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/), which creates a ready-made working starting point.
|
The easiest way to get started with Angular 2 server-side rendering on ASP.NET Core is to use the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/), which creates a ready-made working starting point.
|
||||||
|
|
||||||
### 5(b). Prerendering React components
|
### 5(b). Prerendering React components
|
||||||
|
|
||||||
@@ -301,7 +301,7 @@ The above example is extremely simple - it doesn't use `react-router`, and it do
|
|||||||
|
|
||||||
For an example server-side boot module that knows how to evaluate `react-router` routes and render the correct React component, see [this example](https://github.com/aspnet/JavaScriptServices/blob/dev/templates/ReactReduxSpa/ClientApp/boot-server.tsx).
|
For an example server-side boot module that knows how to evaluate `react-router` routes and render the correct React component, see [this example](https://github.com/aspnet/JavaScriptServices/blob/dev/templates/ReactReduxSpa/ClientApp/boot-server.tsx).
|
||||||
|
|
||||||
Supporting asynchronous data loading involves more considerations. Unlike Angular applications that run asynchronously on the server and freely overwrite server-generated markup with client-generated markup, React strictly wants to run synchronously on the server and always produce the same markup on the server as it does on the client.
|
Supporting asynchronous data loading involves more considerations. Unlike Angular 2 applications that run asynchronously on the server and freely overwrite server-generated markup with client-generated markup, React strictly wants to run synchronously on the server and always produce the same markup on the server as it does on the client.
|
||||||
|
|
||||||
To make this work, you most likely need some way to know in advance what data your React components will need to use, load it separately from those components, and have some way of transferring information about the loaded data from server to client. If you try to implement this in a generalized way, you'll end up reinventing something like the Flux/Redux pattern.
|
To make this work, you most likely need some way to know in advance what data your React components will need to use, load it separately from those components, and have some way of transferring information about the loaded data from server to client. If you try to implement this in a generalized way, you'll end up reinventing something like the Flux/Redux pattern.
|
||||||
|
|
||||||
@@ -374,19 +374,19 @@ So that's enough to build TypeScript. Here's where webpack dev middleware comes
|
|||||||
|
|
||||||
Following on from the preceding example that builds TypeScript, you could extend your Webpack configuration further to support building LESS. There are three major approaches to doing this:
|
Following on from the preceding example that builds TypeScript, you could extend your Webpack configuration further to support building LESS. There are three major approaches to doing this:
|
||||||
|
|
||||||
1. **If using Angular, use its native style loader to attach the styles to components**. This is extremely simple and is usually the right choice if you are using Angular. However it only applies to Angular components, not to any other part of the host page, so sometimes you might want to combine this technique with options 2 or 3 below.
|
1. **If using Angular 2, use its native style loader to attach the styles to components**. This is extremely simple and is usually the right choice if you are using Angular 2. However it only applies to Angular 2 components, not to any other part of the host page, so sometimes you might want to combine this technique with options 2 or 3 below.
|
||||||
|
|
||||||
2. **Or, use Webpack's style loader to attach the styles at runtime**. The CSS markup will be included in your JavaScript bundles and will be attached to the document dynamically. This has certain benefits during development but isn't recommended in production.
|
2. **Or, use Webpack's style loader to attach the styles at runtime**. The CSS markup will be included in your JavaScript bundles and will be attached to the document dynamically. This has certain benefits during development but isn't recommended in production.
|
||||||
|
|
||||||
3. **Or, have each build write a standalone `.css` file to disk**. At runtime, load it using a regular `<link rel='stylesheet'>` tag. This is likely to be the approach you'll want for production use (at least for non-Angular applications, such as React applications) as it's the most robust and best-performing option.
|
3. **Or, have each build write a standalone `.css` file to disk**. At runtime, load it using a regular `<link rel='stylesheet'>` tag. This is likely to be the approach you'll want for production use (at least for non-Angular 2 applications, such as React applications) as it's the most robust and best-performing option.
|
||||||
|
|
||||||
If instead of LESS you prefer SASS or another CSS preprocessor, the exact same techniques should work, but of course you'll need to replace the `less-loader` with an equivalent Webpack loader for SASS or your chosen preprocessor.
|
If instead of LESS you prefer SASS or another CSS preprocessor, the exact same techniques should work, but of course you'll need to replace the `less-loader` with an equivalent Webpack loader for SASS or your chosen preprocessor.
|
||||||
|
|
||||||
#### Approach 1: Scoping styles to Angular components
|
#### Approach 1: Scoping styles to Angular 2 components
|
||||||
|
|
||||||
If you are using Angular, this is the easiest way to perform styling. It works with both server and client rendering, supports Hot Module Replacement, and robustly scopes styles to particular components (and optionally, their descendant elements).
|
If you are using Angular 2, this is the easiest way to perform styling. It works with both server and client rendering, supports Hot Module Replacement, and robustly scopes styles to particular components (and optionally, their descendant elements).
|
||||||
|
|
||||||
This repository's Angular template uses this technique to scope styles to components out of the box. It defines those styles as `.css` files. For example, its components reference `.css` files like this:
|
This repository's Angular 2 template uses this technique to scope styles to components out of the box. It defines those styles as `.css` files. For example, its components reference `.css` files like this:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@Component({
|
@Component({
|
||||||
@@ -415,7 +415,7 @@ Next, add the following loader configuration to the `loaders` array in `webpack.
|
|||||||
{ test: /\.less/, include: /ClientApp/, loader: 'raw-loader!less-loader' }
|
{ test: /\.less/, include: /ClientApp/, loader: 'raw-loader!less-loader' }
|
||||||
```
|
```
|
||||||
|
|
||||||
Notice how this chains together with `less-loader` (which transforms `.less` syntax to plain CSS syntax), then the `raw` loader (which turn the result into a string literal). With this in place, you can reference `.less` files from your Angular components in the obvious way:
|
Notice how this chains together with `less-loader` (which transforms `.less` syntax to plain CSS syntax), then the `raw` loader (which turn the result into a string literal). With this in place, you can reference `.less` files from your Angular 2 components in the obvious way:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@Component({
|
@Component({
|
||||||
@@ -429,7 +429,7 @@ export class SomeComponent { ... }
|
|||||||
|
|
||||||
#### Approach 2: Loading the styles using Webpack and JavaScript
|
#### Approach 2: Loading the styles using Webpack and JavaScript
|
||||||
|
|
||||||
This technique works with any client-side framework (not just Angular), and can also apply styles to the entire document rather than just individual components. It's a little simpler to set up than technique 3, plus it works flawlessly with Hot Module Replacement (HMR). The downside is that it's really only good for development time, because in production you probably don't want users to wait until JavaScript is loaded before styles are applied to the page (this would mean they'd see a 'flash of unstyled content' while the page is being loaded).
|
This technique works with any client-side framework (not just Angular 2), and can also apply styles to the entire document rather than just individual components. It's a little simpler to set up than technique 3, plus it works flawlessly with Hot Module Replacement (HMR). The downside is that it's really only good for development time, because in production you probably don't want users to wait until JavaScript is loaded before styles are applied to the page (this would mean they'd see a 'flash of unstyled content' while the page is being loaded).
|
||||||
|
|
||||||
First create a `.less` file in your project. For example, create a file at `ClientApp/styles/mystyles.less` containing:
|
First create a `.less` file in your project. For example, create a file at `ClientApp/styles/mystyles.less` containing:
|
||||||
|
|
||||||
@@ -631,25 +631,8 @@ Now if you edit any React component (e.g., in `.jsx` or `.tsx` files), the updat
|
|||||||
|
|
||||||
Webpack has built-in HMR support for various types of module, such as styles and React components as described above. But to support HMR for other code modules, you need to add a small block of code that calls `module.hot.accept` to receive the updated module and update the running application.
|
Webpack has built-in HMR support for various types of module, such as styles and React components as described above. But to support HMR for other code modules, you need to add a small block of code that calls `module.hot.accept` to receive the updated module and update the running application.
|
||||||
|
|
||||||
This is [documented in detail on the Webpack site](https://webpack.github.io/docs/hot-module-replacement.html). Or to get a working HMR-enabled ASP.NET Core site with Angular, React, React+Redux, or Knockout, you can use the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/).
|
This is [documented in detail on the Webpack site](https://webpack.github.io/docs/hot-module-replacement.html). Or to get a working HMR-enabled ASP.NET Core site with Angular 2, React, React+Redux, or Knockout, you can use the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/).
|
||||||
|
|
||||||
#### Passing options to the Webpack Hot Middleware client
|
|
||||||
|
|
||||||
You can configure the [Webpack Hot Middleware client](https://github.com/glenjamin/webpack-hot-middleware#client)
|
|
||||||
by using the `HotModuleReplacementClientOptions` property on `WebpackDevMiddlewareOptions`:
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions {
|
|
||||||
HotModuleReplacement = true,
|
|
||||||
HotModuleReplacementClientOptions = new Dictionary<string, string> {
|
|
||||||
{ "reload", "true" },
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
For the list of available options, please see [Webpack Hot Middleware docs](https://github.com/glenjamin/webpack-hot-middleware#client).
|
|
||||||
|
|
||||||
**Note**: The `path` option cannot be overridden this way - it is controlled by the `HotModuleReplacementEndpoint` setting.
|
|
||||||
|
|
||||||
## Routing helper: MapSpaFallbackRoute
|
## Routing helper: MapSpaFallbackRoute
|
||||||
|
|
||||||
@@ -788,14 +771,14 @@ Caveats:
|
|||||||
|
|
||||||
## Debugging your JavaScript/TypeScript code when it runs on the server
|
## Debugging your JavaScript/TypeScript code when it runs on the server
|
||||||
|
|
||||||
When you're using NodeServices or the server-side prerendering feature included in the project templates in this repo, your JavaScript/TypeScript code will execute on the server in a background instance of Node.js. You can enable debugging via [V8 Inspector Integration](https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js) on that Node.js instance. Here's how to do it.
|
When you're using NodeServices or the server-side prerendering feature included in the project templates in this repo, your JavaScript/TypeScript code will execute on the server in a background instance of Node.js. You can enable debugging on that Node.js instance. Here's how to do it.
|
||||||
|
|
||||||
First, in your `Startup.cs` file, in the `ConfigureServices` method, add the following:
|
First, in your `Startup.cs` file, in the `ConfigureServices` method, add the following:
|
||||||
|
|
||||||
```
|
```
|
||||||
services.AddNodeServices(options => {
|
services.AddNodeServices(options => {
|
||||||
options.LaunchWithDebugging = true;
|
options.LaunchWithDebugging = true;
|
||||||
options.DebuggingPort = 9229;
|
options.DebuggingPort = 5858;
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -803,20 +786,21 @@ Now, run your application from that command line (e.g., `dotnet run`). Then in a
|
|||||||
|
|
||||||
In the console, you should see all the normal trace messages appear, plus among them will be:
|
In the console, you should see all the normal trace messages appear, plus among them will be:
|
||||||
|
|
||||||
```
|
-----
|
||||||
warn: Microsoft.AspNetCore.NodeServices[0]
|
*** Node.js debugging is enabled ***
|
||||||
Debugger listening on port 9229.
|
Debugger listening on port 5858
|
||||||
warn: Microsoft.AspNetCore.NodeServices[0]
|
|
||||||
Warning: This is an experimental feature and could change at any time.
|
|
||||||
warn: Microsoft.AspNetCore.NodeServices[0]
|
|
||||||
To start debugging, open the following URL in Chrome:
|
|
||||||
warn: Microsoft.AspNetCore.NodeServices[0]
|
|
||||||
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
||||||
```
|
|
||||||
|
|
||||||
As per instructions open the URL in Chrome. Alternatively you can go to the `Sources` tab of the Dev Tools (at http://localhost:5000) and connect to the Node instance under `Threads` in the right sidebar.
|
To debug, run:
|
||||||
|
node-inspector
|
||||||
|
|
||||||
By expanding the `webpack://` entry in the sidebar, you'll be able to find your original source code (it's using source maps), and then set breakpoints in it. When you re-run your app in another browser window, your breakpoints will be hit, then you can debug the server-side execution just like you'd debug client-side execution. It looks like this:
|
If you haven't yet installed node-inspector, you can do so as follows:
|
||||||
|
npm install -g node-inspector
|
||||||
|
-----
|
||||||
|
|
||||||

|
In some other command line window, follow those instructions (i.e., install `node-inspector` as it describes, then run `node-inspector`). Then you can open a browser at `http://127.0.0.1:8080/?port=5858` and you'll see the debugger UI.
|
||||||
|
|
||||||
|
By expanding the `webpack://` entry in the sidebar, you'll be able to find your original TypeScript code (it's using source maps), and then set breakpoints in it. When you re-run your app in another browser window, your breakpoints will be hit, then you can debug the server-side execution just like you'd debug client-side execution. It looks like this:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
(Note: although this looks like Chrome's native debugger for client-side code, it is actually a JavaScript-powered debugger UI that's connected to the server-side runtime)
|
||||||
|
|||||||
@@ -16,8 +16,6 @@ namespace Microsoft.AspNetCore.SpaServices.Webpack
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal class ConditionalProxyMiddleware
|
internal class ConditionalProxyMiddleware
|
||||||
{
|
{
|
||||||
private const int DefaultHttpBufferSize = 4096;
|
|
||||||
|
|
||||||
private readonly HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
private readonly RequestDelegate _next;
|
private readonly RequestDelegate _next;
|
||||||
private readonly ConditionalProxyMiddlewareOptions _options;
|
private readonly ConditionalProxyMiddlewareOptions _options;
|
||||||
@@ -95,12 +93,7 @@ namespace Microsoft.AspNetCore.SpaServices.Webpack
|
|||||||
|
|
||||||
// SendAsync removes chunking from the response. This removes the header so it doesn't expect a chunked response.
|
// SendAsync removes chunking from the response. This removes the header so it doesn't expect a chunked response.
|
||||||
context.Response.Headers.Remove("transfer-encoding");
|
context.Response.Headers.Remove("transfer-encoding");
|
||||||
|
await responseMessage.Content.CopyToAsync(context.Response.Body);
|
||||||
using (var responseStream = await responseMessage.Content.ReadAsStreamAsync())
|
|
||||||
{
|
|
||||||
await responseStream.CopyToAsync(context.Response.Body, DefaultHttpBufferSize, context.RequestAborted);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,9 +78,7 @@ namespace Microsoft.AspNetCore.Builder
|
|||||||
// Ideally, this would be relative to the application's PathBase (so it could work in virtual directories)
|
// Ideally, this would be relative to the application's PathBase (so it could work in virtual directories)
|
||||||
// but it's not clear that such information exists during application startup, as opposed to within the context
|
// but it's not clear that such information exists during application startup, as opposed to within the context
|
||||||
// of a request.
|
// of a request.
|
||||||
var hmrEndpoint = !string.IsNullOrEmpty(options.HotModuleReplacementEndpoint)
|
var hmrEndpoint = "/__webpack_hmr";
|
||||||
? options.HotModuleReplacementEndpoint
|
|
||||||
: "/__webpack_hmr"; // Matches webpack's built-in default
|
|
||||||
|
|
||||||
// Tell Node to start the server hosting webpack-dev-middleware
|
// Tell Node to start the server hosting webpack-dev-middleware
|
||||||
var devServerOptions = new
|
var devServerOptions = new
|
||||||
|
|||||||
@@ -13,12 +13,6 @@ namespace Microsoft.AspNetCore.SpaServices.Webpack
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool HotModuleReplacement { get; set; }
|
public bool HotModuleReplacement { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If set, overrides the URL that Webpack's client-side code will connect to when listening for updates.
|
|
||||||
/// This must be a root-relative URL similar to "/__webpack_hmr" (which is the default endpoint).
|
|
||||||
/// </summary>
|
|
||||||
public string HotModuleReplacementEndpoint { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Overrides the internal port number that client-side HMR code will connect to.
|
/// Overrides the internal port number that client-side HMR code will connect to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -30,11 +24,6 @@ namespace Microsoft.AspNetCore.SpaServices.Webpack
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool ReactHotModuleReplacement { get; set; }
|
public bool ReactHotModuleReplacement { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Specifies additional options to be passed to the Webpack Hot Middleware client, if used.
|
|
||||||
/// </summary>
|
|
||||||
public IDictionary<string, string> HotModuleReplacementClientOptions { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Specifies the Webpack configuration file to be used. If not set, defaults to 'webpack.config.js'.
|
/// Specifies the Webpack configuration file to be used. If not set, defaults to 'webpack.config.js'.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -4,5 +4,3 @@
|
|||||||
|
|
||||||
/**/.d.ts
|
/**/.d.ts
|
||||||
!/src/**/*.d.ts
|
!/src/**/*.d.ts
|
||||||
|
|
||||||
yarn.lock
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
!/*.js
|
!/*.js
|
||||||
!/*.d.ts
|
!/*.d.ts
|
||||||
/typings/
|
/typings/
|
||||||
yarn.lock
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aspnet-prerendering",
|
"name": "aspnet-prerendering",
|
||||||
"version": "2.0.5",
|
"version": "2.0.2",
|
||||||
"description": "Helpers for server-side rendering of JavaScript applications in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.",
|
"description": "Helpers for server-side rendering of JavaScript applications in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -21,7 +21,8 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^6.0.42",
|
"@types/node": "^6.0.42",
|
||||||
|
"@types/whatwg-fetch": "0.0.31",
|
||||||
"rimraf": "^2.5.4",
|
"rimraf": "^2.5.4",
|
||||||
"typescript": "^2.2.1"
|
"typescript": "^2.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,7 @@ export function createServerRenderer(bootFunc: BootFunc): RenderToStringFunc {
|
|||||||
});
|
});
|
||||||
const parsedAbsoluteRequestUrl = url.parse(absoluteRequestUrl);
|
const parsedAbsoluteRequestUrl = url.parse(absoluteRequestUrl);
|
||||||
const params: BootFuncParams = {
|
const params: BootFuncParams = {
|
||||||
// It's helpful for boot funcs to receive the query as a key-value object, so parse it here
|
location: url.parse(requestPathAndQuery),
|
||||||
// e.g., react-redux-router requires location.query to be a key-value object for consistency with client-side behaviour
|
|
||||||
location: url.parse(requestPathAndQuery, /* parseQueryString */ true),
|
|
||||||
origin: parsedAbsoluteRequestUrl.protocol + '//' + parsedAbsoluteRequestUrl.host,
|
origin: parsedAbsoluteRequestUrl.protocol + '//' + parsedAbsoluteRequestUrl.host,
|
||||||
url: requestPathAndQuery,
|
url: requestPathAndQuery,
|
||||||
baseUrl: (requestPathBase || '') + '/',
|
baseUrl: (requestPathBase || '') + '/',
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ interface RenderToStringCallback {
|
|||||||
|
|
||||||
interface RenderToStringResult {
|
interface RenderToStringResult {
|
||||||
html: string;
|
html: string;
|
||||||
statusCode?: number;
|
|
||||||
globals?: { [key: string]: any };
|
globals?: { [key: string]: any };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,3 @@ This NPM package is an internal implementation detail of the `Microsoft.AspNetCo
|
|||||||
|
|
||||||
You should not use this package directly in your own applications, because it is not supported, and there are no
|
You should not use this package directly in your own applications, because it is not supported, and there are no
|
||||||
guarantees about how its APIs will change in the future.
|
guarantees about how its APIs will change in the future.
|
||||||
|
|
||||||
## History
|
|
||||||
|
|
||||||
* Version 1.x amends the Webpack config to insert `react-transform` and `react-transform-hmr` entries on `babel-loader`.
|
|
||||||
* Version 2.x drops support for the Babel plugin, and instead amends the Webpack config to insert `react-hot-loader/webpack` and `react-hot-loader/patch` entries. This means it works with React Hot Loader v3.
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aspnet-webpack-react",
|
"name": "aspnet-webpack-react",
|
||||||
"version": "2.0.0",
|
"version": "1.0.3",
|
||||||
"description": "Helpers for using Webpack with React in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.",
|
"description": "Helpers for using Webpack with React in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -16,13 +16,22 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/aspnet/JavaScriptServices.git"
|
"url": "https://github.com/aspnet/JavaScriptServices.git"
|
||||||
},
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"babel-core": "^6.7.2",
|
||||||
|
"babel-loader": "^6.2.4",
|
||||||
|
"babel-plugin-react-transform": "^2.0.2",
|
||||||
|
"babel-preset-es2015": "^6.6.0",
|
||||||
|
"babel-preset-react": "^6.5.0",
|
||||||
|
"react": "^15.0.0",
|
||||||
|
"react-transform-hmr": "^1.0.4"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/webpack": "^2.2.0",
|
"@types/webpack": "^1.12.34",
|
||||||
"rimraf": "^2.5.4",
|
"rimraf": "^2.5.4",
|
||||||
"typescript": "^2.0.0",
|
"typescript": "^2.0.0",
|
||||||
"webpack": "^2.2.0"
|
"webpack": "^1.12.14"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"webpack": "^2.2.0"
|
"webpack": "^1.12.14"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,66 +1,37 @@
|
|||||||
import * as webpack from 'webpack';
|
import * as webpack from 'webpack';
|
||||||
|
|
||||||
const reactHotLoaderWebpackLoader = 'react-hot-loader/webpack';
|
export function addReactHotModuleReplacementBabelTransform(webpackConfig: webpack.Configuration) {
|
||||||
const reactHotLoaderPatch = 'react-hot-loader/patch';
|
const moduleRules: webpack.Loader[] =
|
||||||
const supportedTypeScriptLoaders = ['ts-loader', 'awesome-typescript-loader'];
|
(webpackConfig.module as any).rules // Webpack < 2.1.0 beta 23
|
||||||
|
|| webpackConfig.module.loaders; // Webpack >= 2.1.0 beta 23
|
||||||
|
|
||||||
export function addReactHotModuleReplacementConfig(webpackConfig: webpack.Configuration) {
|
moduleRules.forEach(loaderConfig => {
|
||||||
const moduleConfig = webpackConfig.module as webpack.NewModule;
|
if (loaderConfig.loader && loaderConfig.loader.match(/\bbabel-loader\b/)) {
|
||||||
const moduleRules = moduleConfig.rules;
|
// Ensure the babel-loader options includes a 'query'
|
||||||
if (!moduleRules) {
|
const query = loaderConfig.query = loaderConfig.query || {};
|
||||||
return; // Unknown rules list format. Might be Webpack 1.x, which is not supported.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the rule that loads TypeScript files, and prepend 'react-hot-loader/webpack'
|
// Ensure Babel plugins includes 'react-transform'
|
||||||
// to its array of loaders
|
const plugins = query['plugins'] = query['plugins'] || [];
|
||||||
for (let ruleIndex = 0; ruleIndex < moduleRules.length; ruleIndex++) {
|
const hasReactTransform = plugins.some(p => p && p[0] === 'react-transform');
|
||||||
// We only support NewUseRule (i.e., { use: ... }) because OldUseRule doesn't accept array values
|
if (!hasReactTransform) {
|
||||||
const rule = moduleRules[ruleIndex] as webpack.NewUseRule;
|
plugins.push(['react-transform', {}]);
|
||||||
if (!rule.use) {
|
}
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We're looking for the first 'use' value that's a TypeScript loader
|
// Ensure 'react-transform' plugin is configured to use 'react-transform-hmr'
|
||||||
const loadersArray = rule.use instanceof Array ? rule.use : [rule.use];
|
plugins.forEach(pluginConfig => {
|
||||||
const isTypescriptLoader = supportedTypeScriptLoaders.some(typeScriptLoaderName => containsLoader(loadersArray, typeScriptLoaderName));
|
if (pluginConfig && pluginConfig[0] === 'react-transform') {
|
||||||
if (!isTypescriptLoader) {
|
const pluginOpts = pluginConfig[1] = pluginConfig[1] || {};
|
||||||
continue;
|
const transforms = pluginOpts.transforms = pluginOpts.transforms || [];
|
||||||
}
|
const hasReactTransformHmr = transforms.some(t => t.transform === 'react-transform-hmr');
|
||||||
|
if (!hasReactTransformHmr) {
|
||||||
// This is the one - prefix it with the react-hot-loader loader
|
transforms.push({
|
||||||
// (unless it's already in there somewhere)
|
transform: 'react-transform-hmr',
|
||||||
if (!containsLoader(loadersArray, reactHotLoaderWebpackLoader)) {
|
imports: ['react'],
|
||||||
loadersArray.unshift(reactHotLoaderWebpackLoader);
|
locals: ['module'] // Important for Webpack HMR
|
||||||
rule.use = loadersArray; // In case we normalised it to an array
|
});
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
// Ensure the entrypoint is prefixed with 'react-hot-loader/patch' (unless it's already in there).
|
|
||||||
// We only support entrypoints of the form { name: value } (not just 'name' or ['name'])
|
|
||||||
// because that gives us a place to prepend the new value
|
|
||||||
if (!webpackConfig.entry || typeof webpackConfig.entry === 'string' || webpackConfig.entry instanceof Array) {
|
|
||||||
throw new Error('Cannot enable React HMR because \'entry\' in Webpack config is not of the form { name: value }');
|
|
||||||
}
|
|
||||||
const entryConfig = webpackConfig.entry as webpack.Entry;
|
|
||||||
Object.getOwnPropertyNames(entryConfig).forEach(entrypointName => {
|
|
||||||
if (typeof(entryConfig[entrypointName]) === 'string') {
|
|
||||||
// Normalise to array
|
|
||||||
entryConfig[entrypointName] = [entryConfig[entrypointName] as string];
|
|
||||||
}
|
|
||||||
|
|
||||||
let entryValueArray = entryConfig[entrypointName] as string[];
|
|
||||||
if (entryValueArray.indexOf(reactHotLoaderPatch) < 0) {
|
|
||||||
entryValueArray.unshift(reactHotLoaderPatch);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function containsLoader(loadersArray: webpack.Loader[], loaderName: string) {
|
|
||||||
return loadersArray.some(loader => {
|
|
||||||
// Allow 'use' values to be either { loader: 'name' } or 'name'
|
|
||||||
// No need to support legacy webpack.OldLoader
|
|
||||||
const actualLoaderName = (loader as webpack.NewLoader).loader || (loader as string);
|
|
||||||
return actualLoaderName && new RegExp(`\\b${ loaderName }\\b`).test(actualLoaderName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1 @@
|
|||||||
export { addReactHotModuleReplacementConfig } from './HotModuleReplacement';
|
export { addReactHotModuleReplacementBabelTransform } from './HotModuleReplacement';
|
||||||
|
|
||||||
// Temporarily alias addReactHotModuleReplacementConfig as addReactHotModuleReplacementBabelTransform for backward
|
|
||||||
// compatibility with aspnet-webpack 1.x. In aspnet-webpack 2.0, we can drop the old name (and also deprecate
|
|
||||||
// some other no-longer-supported functionality, such as LoadViaWebpack).
|
|
||||||
export { addReactHotModuleReplacementConfig as addReactHotModuleReplacementBabelTransform } from './HotModuleReplacement';
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aspnet-webpack",
|
"name": "aspnet-webpack",
|
||||||
"version": "1.0.29",
|
"version": "1.0.26",
|
||||||
"description": "Helpers for using Webpack in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.",
|
"description": "Helpers for using Webpack in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/connect": "^3.4.30",
|
"@types/connect": "^3.4.30",
|
||||||
"@types/node": "^6.0.42",
|
"@types/node": "^6.0.42",
|
||||||
"@types/webpack": "^2.2.0",
|
"@types/webpack": "^1.12.34",
|
||||||
"rimraf": "^2.5.4",
|
"rimraf": "^2.5.4",
|
||||||
"typescript": "^2.0.0",
|
"typescript": "^2.0.0",
|
||||||
"webpack": "^1.13.2"
|
"webpack": "^1.13.2"
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import * as webpack from 'webpack';
|
|||||||
import * as url from 'url';
|
import * as url from 'url';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as querystring from 'querystring';
|
|
||||||
import { requireNewCopy } from './RequireNewCopy';
|
import { requireNewCopy } from './RequireNewCopy';
|
||||||
|
|
||||||
export type CreateDevServerResult = {
|
export type CreateDevServerResult = {
|
||||||
@@ -23,25 +22,14 @@ interface CreateDevServerOptions {
|
|||||||
hotModuleReplacementEndpointUrl: string;
|
hotModuleReplacementEndpointUrl: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
type StringMap<T> = [(key: string) => T];
|
|
||||||
|
|
||||||
// These are the options configured in C# and then JSON-serialized, hence the C#-style naming
|
// These are the options configured in C# and then JSON-serialized, hence the C#-style naming
|
||||||
interface DevServerOptions {
|
interface DevServerOptions {
|
||||||
HotModuleReplacement: boolean;
|
HotModuleReplacement: boolean;
|
||||||
HotModuleReplacementServerPort: number;
|
HotModuleReplacementServerPort: number;
|
||||||
HotModuleReplacementClientOptions: StringMap<string>;
|
|
||||||
ReactHotModuleReplacement: boolean;
|
ReactHotModuleReplacement: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We support these three kinds of webpack.config.js export. We don't currently support exported promises
|
function attachWebpackDevMiddleware(app: any, webpackConfig: webpack.Configuration, enableHotModuleReplacement: boolean, enableReactHotModuleReplacement: boolean, hmrClientEndpoint: string, hmrServerEndpoint: string) {
|
||||||
// (though we might be able to add that in the future, if there's a need).
|
|
||||||
type WebpackConfigOrArray = webpack.Configuration | webpack.Configuration[];
|
|
||||||
interface WebpackConfigFunc {
|
|
||||||
(env?: any): WebpackConfigOrArray;
|
|
||||||
}
|
|
||||||
type WebpackConfigFileExport = WebpackConfigOrArray | WebpackConfigFunc;
|
|
||||||
|
|
||||||
function attachWebpackDevMiddleware(app: any, webpackConfig: webpack.Configuration, enableHotModuleReplacement: boolean, enableReactHotModuleReplacement: boolean, hmrClientOptions: StringMap<string>, hmrServerEndpoint: string) {
|
|
||||||
// Build the final Webpack config based on supplied options
|
// Build the final Webpack config based on supplied options
|
||||||
if (enableHotModuleReplacement) {
|
if (enableHotModuleReplacement) {
|
||||||
// For this, we only support the key/value config format, not string or string[], since
|
// For this, we only support the key/value config format, not string or string[], since
|
||||||
@@ -57,7 +45,7 @@ function attachWebpackDevMiddleware(app: any, webpackConfig: webpack.Configurati
|
|||||||
// Augment all entry points so they support HMR (unless they already do)
|
// Augment all entry points so they support HMR (unless they already do)
|
||||||
Object.getOwnPropertyNames(entryPoints).forEach(entryPointName => {
|
Object.getOwnPropertyNames(entryPoints).forEach(entryPointName => {
|
||||||
const webpackHotMiddlewareEntryPoint = 'webpack-hot-middleware/client';
|
const webpackHotMiddlewareEntryPoint = 'webpack-hot-middleware/client';
|
||||||
const webpackHotMiddlewareOptions = '?' + querystring.stringify(hmrClientOptions);
|
const webpackHotMiddlewareOptions = `?path=` + encodeURIComponent(hmrClientEndpoint);
|
||||||
if (typeof entryPoints[entryPointName] === 'string') {
|
if (typeof entryPoints[entryPointName] === 'string') {
|
||||||
entryPoints[entryPointName] = [webpackHotMiddlewareEntryPoint + webpackHotMiddlewareOptions, entryPoints[entryPointName]];
|
entryPoints[entryPointName] = [webpackHotMiddlewareEntryPoint + webpackHotMiddlewareOptions, entryPoints[entryPointName]];
|
||||||
} else if (firstIndexOfStringStartingWith(entryPoints[entryPointName], webpackHotMiddlewareEntryPoint) < 0) {
|
} else if (firstIndexOfStringStartingWith(entryPoints[entryPointName], webpackHotMiddlewareEntryPoint) < 0) {
|
||||||
@@ -108,8 +96,7 @@ function attachWebpackDevMiddleware(app: any, webpackConfig: webpack.Configurati
|
|||||||
const compiler = webpack(webpackConfig);
|
const compiler = webpack(webpackConfig);
|
||||||
app.use(require('webpack-dev-middleware')(compiler, {
|
app.use(require('webpack-dev-middleware')(compiler, {
|
||||||
noInfo: true,
|
noInfo: true,
|
||||||
publicPath: webpackConfig.output.publicPath,
|
publicPath: webpackConfig.output.publicPath
|
||||||
watchOptions: webpackConfig.watchOptions
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// After each compilation completes, copy the in-memory filesystem to disk.
|
// After each compilation completes, copy the in-memory filesystem to disk.
|
||||||
@@ -131,51 +118,12 @@ function attachWebpackDevMiddleware(app: any, webpackConfig: webpack.Configurati
|
|||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
throw new Error('HotModuleReplacement failed because of an error while loading \'webpack-hot-middleware\'. Error was: ' + ex.stack);
|
throw new Error('HotModuleReplacement failed because of an error while loading \'webpack-hot-middleware\'. Error was: ' + ex.stack);
|
||||||
}
|
}
|
||||||
app.use(workaroundIISExpressEventStreamFlushingIssue(hmrServerEndpoint));
|
|
||||||
app.use(webpackHotMiddlewareModule(compiler, {
|
app.use(webpackHotMiddlewareModule(compiler, {
|
||||||
path: hmrServerEndpoint
|
path: hmrServerEndpoint
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function workaroundIISExpressEventStreamFlushingIssue(path: string): connect.NextHandleFunction {
|
|
||||||
// IIS Express makes HMR seem very slow, because when it's reverse-proxying an EventStream response
|
|
||||||
// from Kestrel, it doesn't pass through the lines to the browser immediately, even if you're calling
|
|
||||||
// response.Flush (or equivalent) in your ASP.NET Core code. For some reason, it waits until the following
|
|
||||||
// line is sent. By default, that wouldn't be until the next HMR heartbeat, which can be up to 5 seconds later.
|
|
||||||
// In effect, it looks as if your code is taking 5 seconds longer to compile than it really does.
|
|
||||||
//
|
|
||||||
// As a workaround, this connect middleware intercepts requests to the HMR endpoint, and modifies the response
|
|
||||||
// stream so that all EventStream 'data' lines are immediately followed with a further blank line. This is
|
|
||||||
// harmless in non-IIS-Express cases, because it's OK to have extra blank lines in an EventStream response.
|
|
||||||
// The implementation is simplistic - rather than using a true stream reader, we just patch the 'write'
|
|
||||||
// method. This relies on webpack's HMR code always writing complete EventStream messages with a single
|
|
||||||
// 'write' call. That works fine today, but if webpack's HMR code was changed, this workaround might have
|
|
||||||
// to be updated.
|
|
||||||
const eventStreamLineStart = /^data\:/;
|
|
||||||
return (req, res, next) => {
|
|
||||||
// We only want to interfere with requests to the HMR endpoint, so check this request matches
|
|
||||||
const urlMatchesPath = (req.url === path) || (req.url.split('?', 1)[0] === path);
|
|
||||||
if (urlMatchesPath) {
|
|
||||||
const origWrite = res.write;
|
|
||||||
res.write = function (chunk) {
|
|
||||||
const result = origWrite.apply(this, arguments);
|
|
||||||
|
|
||||||
// We only want to interfere with actual EventStream data lines, so check it is one
|
|
||||||
if (typeof (chunk) === 'string') {
|
|
||||||
if (eventStreamLineStart.test(chunk) && chunk.charAt(chunk.length - 1) === '\n') {
|
|
||||||
origWrite.call(this, '\n\n');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return next();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function copyRecursiveToRealFsSync(from: typeof fs, rootDir: string, exclude: RegExp[]) {
|
function copyRecursiveToRealFsSync(from: typeof fs, rootDir: string, exclude: RegExp[]) {
|
||||||
from.readdirSync(rootDir).forEach(filename => {
|
from.readdirSync(rootDir).forEach(filename => {
|
||||||
const fullPath = pathJoinSafe(rootDir, filename);
|
const fullPath = pathJoinSafe(rootDir, filename);
|
||||||
@@ -208,7 +156,7 @@ function pathJoinSafe(rootPath: string, filePath: string) {
|
|||||||
|
|
||||||
function beginWebpackWatcher(webpackConfig: webpack.Configuration) {
|
function beginWebpackWatcher(webpackConfig: webpack.Configuration) {
|
||||||
const compiler = webpack(webpackConfig);
|
const compiler = webpack(webpackConfig);
|
||||||
compiler.watch(webpackConfig.watchOptions || {}, (err, stats) => {
|
compiler.watch({ /* watchOptions */ }, (err, stats) => {
|
||||||
// The default error reporter is fine for now, but could be customized here in the future if desired
|
// The default error reporter is fine for now, but could be customized here in the future if desired
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -217,16 +165,10 @@ export function createWebpackDevServer(callback: CreateDevServerCallback, option
|
|||||||
const options: CreateDevServerOptions = JSON.parse(optionsJson);
|
const options: CreateDevServerOptions = JSON.parse(optionsJson);
|
||||||
|
|
||||||
// Read the webpack config's export, and normalize it into the more general 'array of configs' format
|
// Read the webpack config's export, and normalize it into the more general 'array of configs' format
|
||||||
let webpackConfigExport: WebpackConfigFileExport = requireNewCopy(options.webpackConfigPath);
|
let webpackConfigArray: webpack.Configuration[] = requireNewCopy(options.webpackConfigPath);
|
||||||
if (webpackConfigExport instanceof Function) {
|
if (!(webpackConfigArray instanceof Array)) {
|
||||||
// If you export a function, we'll call it with an undefined 'env' arg, since we have nothing else
|
webpackConfigArray = [webpackConfigArray as webpack.Configuration];
|
||||||
// to pass. This is the same as what the webpack CLI tool does if you specify no '--env.x' values.
|
|
||||||
// In the future, we could add support for configuring the 'env' param in Startup.cs. But right
|
|
||||||
// now, it's not clear that people will want to do that (and they can always make up their own
|
|
||||||
// default env values in their webpack.config.js).
|
|
||||||
webpackConfigExport = webpackConfigExport();
|
|
||||||
}
|
}
|
||||||
const webpackConfigArray = webpackConfigExport instanceof Array ? webpackConfigExport : [webpackConfigExport];
|
|
||||||
|
|
||||||
const enableHotModuleReplacement = options.suppliedOptions.HotModuleReplacement;
|
const enableHotModuleReplacement = options.suppliedOptions.HotModuleReplacement;
|
||||||
const enableReactHotModuleReplacement = options.suppliedOptions.ReactHotModuleReplacement;
|
const enableReactHotModuleReplacement = options.suppliedOptions.ReactHotModuleReplacement;
|
||||||
@@ -268,12 +210,7 @@ export function createWebpackDevServer(callback: CreateDevServerCallback, option
|
|||||||
|| `http://localhost:${listener.address().port}/__webpack_hmr`; // Fall back on absolute URL to bypass proxying
|
|| `http://localhost:${listener.address().port}/__webpack_hmr`; // Fall back on absolute URL to bypass proxying
|
||||||
const hmrServerEndpoint = options.hotModuleReplacementEndpointUrl
|
const hmrServerEndpoint = options.hotModuleReplacementEndpointUrl
|
||||||
|| '/__webpack_hmr'; // URL is relative to webpack dev server root
|
|| '/__webpack_hmr'; // URL is relative to webpack dev server root
|
||||||
|
attachWebpackDevMiddleware(app, webpackConfig, enableHotModuleReplacement, enableReactHotModuleReplacement, hmrClientEndpoint, hmrServerEndpoint);
|
||||||
// We always overwrite the 'path' option as it needs to match what the .NET side is expecting
|
|
||||||
const hmrClientOptions = options.suppliedOptions.HotModuleReplacementClientOptions || <StringMap<string>>{};
|
|
||||||
hmrClientOptions['path'] = hmrClientEndpoint;
|
|
||||||
|
|
||||||
attachWebpackDevMiddleware(app, webpackConfig, enableHotModuleReplacement, enableReactHotModuleReplacement, hmrClientOptions, hmrServerEndpoint);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
"target": "es5",
|
"target": "es5",
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"outDir": ".",
|
"outDir": ".",
|
||||||
"lib": ["es2015"],
|
"lib": ["es2015"]
|
||||||
"types": ["node"]
|
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"src/index.ts"
|
"src/index.ts"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "domain-task",
|
"name": "domain-task",
|
||||||
"version": "3.0.0",
|
"version": "2.0.2",
|
||||||
"description": "Tracks outstanding operations for a logical thread of execution",
|
"description": "Tracks outstanding operations for a logical thread of execution",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -22,7 +22,8 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^6.0.42",
|
"@types/node": "^6.0.42",
|
||||||
|
"@types/whatwg-fetch": "0.0.31",
|
||||||
"rimraf": "^2.5.4",
|
"rimraf": "^2.5.4",
|
||||||
"typescript": "^2.2.1"
|
"typescript": "^2.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ function issueRequest(baseUrl: string, req: string | Request, init?: RequestInit
|
|||||||
if (baseUrl) {
|
if (baseUrl) {
|
||||||
if (req instanceof Request) {
|
if (req instanceof Request) {
|
||||||
const reqAsRequest = req as Request;
|
const reqAsRequest = req as Request;
|
||||||
(reqAsRequest as any).url = url.resolve(baseUrl, reqAsRequest.url);
|
reqAsRequest.url = url.resolve(baseUrl, reqAsRequest.url);
|
||||||
} else {
|
} else {
|
||||||
req = url.resolve(baseUrl, req as string);
|
req = url.resolve(baseUrl, req as string);
|
||||||
}
|
}
|
||||||
@@ -25,6 +25,15 @@ function issueRequest(baseUrl: string, req: string | Request, init?: RequestInit
|
|||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Currently, some part of ASP.NET (perhaps just Kestrel on Mac - unconfirmed) doesn't complete
|
||||||
|
// its responses if we send 'Connection: close', which is the default. So if no 'Connection' header
|
||||||
|
// has been specified explicitly, use 'Connection: keep-alive'.
|
||||||
|
init = init || {};
|
||||||
|
init.headers = init.headers || {};
|
||||||
|
if (!init.headers['Connection']) {
|
||||||
|
init.headers['Connection'] = 'keep-alive';
|
||||||
|
}
|
||||||
|
|
||||||
return isomorphicFetch(req, init);
|
return isomorphicFetch(req, init);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
37
src/Microsoft.AspNetCore.SpaServices/project.json
Normal file
37
src/Microsoft.AspNetCore.SpaServices/project.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"description": "Helpers for building single-page applications on ASP.NET MVC Core",
|
||||||
|
"version": "1.1.0-rc1-*",
|
||||||
|
"packOptions": {
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/aspnet/javascriptservices"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"aspnetcore",
|
||||||
|
"aspnetcoremvc",
|
||||||
|
"nodeservices"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"buildOptions": {
|
||||||
|
"warningsAsErrors": true,
|
||||||
|
"keyFile": "../../tools/Key.snk",
|
||||||
|
"embed": [
|
||||||
|
"Content/**/*"
|
||||||
|
],
|
||||||
|
"xmlDoc": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.AspNetCore.Mvc": "1.1.0",
|
||||||
|
"Microsoft.AspNetCore.NodeServices": "1.1.0-*"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net451": {},
|
||||||
|
"netstandard1.6": {}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"prepublish": [
|
||||||
|
"npm install",
|
||||||
|
"node node_modules/webpack/bin/webpack.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
2
templates/Angular2Spa/.deployment
Normal file
2
templates/Angular2Spa/.deployment
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[config]
|
||||||
|
SCM_SCRIPT_GENERATOR_ARGS=--aspNetCore project.json
|
||||||
90
templates/Angular2Spa/Angular2Spa.csproj
Normal file
90
templates/Angular2Spa/Angular2Spa.csproj
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp1.1</TargetFramework>
|
||||||
|
<PreserveCompilationContext>true</PreserveCompilationContext>
|
||||||
|
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
||||||
|
<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
|
||||||
|
<GlobalExclude>$(GlobalExclude);bin\**;obj\**;node_modules\**;**\*.user;**\*.suo;**\*.*proj;.git\**</GlobalExclude>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="**\*" Exclude="$(GlobalExclude)"/>
|
||||||
|
<Compile Include="**\*.cs" Exclude="$(GlobalExclude)" />
|
||||||
|
<EmbeddedResource Include="**\*.resx" Exclude="$(GlobalExclude)" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NETCore.App">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.NET.Sdk.Web">
|
||||||
|
<Version>1.0.0-alpha-20161104-2-112</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Diagnostics">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Mvc">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Razor.Tools">
|
||||||
|
<Version>1.1.0-preview4-final</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.SpaServices">
|
||||||
|
<Version>1.1.0-*</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.StaticFiles">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging.Console">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging.Debug">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions">
|
||||||
|
<Version>1.1.0</Version>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- Files not to show in IDE -->
|
||||||
|
<None Remove=".bowerrc" />
|
||||||
|
<None Remove="yarn.lock" />
|
||||||
|
|
||||||
|
<!-- Files not to publish (note that the 'dist' subfolders are re-added below) -->
|
||||||
|
<Content Remove="ClientApp\**" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Target Name="RunWebpack" AfterTargets="ComputeFilesToPublish">
|
||||||
|
<!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
|
||||||
|
<Exec Command="npm install" />
|
||||||
|
<Exec Command="node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod" />
|
||||||
|
<Exec Command="node node_modules/webpack/bin/webpack.js --env.prod" />
|
||||||
|
|
||||||
|
<!-- Include the newly-built files in the publish output -->
|
||||||
|
<ItemGroup>
|
||||||
|
<DistFiles Include="wwwroot\dist\**; ClientApp\dist\**" />
|
||||||
|
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
|
||||||
|
<RelativePath>%(DistFiles.Identity)</RelativePath>
|
||||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
|
</ResolvedFileToPublish>
|
||||||
|
</ItemGroup>
|
||||||
|
</Target>
|
||||||
|
</Project>
|
||||||
20
templates/Angular2Spa/Angular2Spa.xproj
Normal file
20
templates/Angular2Spa/Angular2Spa.xproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||||
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>8f5cb8a9-3086-4b49-a1c2-32a9f89bca11</ProjectGuid>
|
||||||
|
<RootNamespace>Angular2Spa</RootNamespace>
|
||||||
|
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
|
||||||
|
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||||
|
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VSToolsPath)\DotNet.Web\Microsoft.DotNet.Web.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||||
|
</Project>
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { RouterModule } from '@angular/router';
|
import { RouterModule } from '@angular/router';
|
||||||
|
import { UniversalModule } from 'angular2-universal';
|
||||||
import { AppComponent } from './components/app/app.component'
|
import { AppComponent } from './components/app/app.component'
|
||||||
import { NavMenuComponent } from './components/navmenu/navmenu.component';
|
import { NavMenuComponent } from './components/navmenu/navmenu.component';
|
||||||
import { HomeComponent } from './components/home/home.component';
|
import { HomeComponent } from './components/home/home.component';
|
||||||
import { FetchDataComponent } from './components/fetchdata/fetchdata.component';
|
import { FetchDataComponent } from './components/fetchdata/fetchdata.component';
|
||||||
import { CounterComponent } from './components/counter/counter.component';
|
import { CounterComponent } from './components/counter/counter.component';
|
||||||
|
|
||||||
export const sharedConfig: NgModule = {
|
@NgModule({
|
||||||
bootstrap: [ AppComponent ],
|
bootstrap: [ AppComponent ],
|
||||||
declarations: [
|
declarations: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
@@ -17,6 +17,7 @@ export const sharedConfig: NgModule = {
|
|||||||
HomeComponent
|
HomeComponent
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
|
UniversalModule, // Must be first import. This automatically imports BrowserModule, HttpModule, and JsonpModule too.
|
||||||
RouterModule.forRoot([
|
RouterModule.forRoot([
|
||||||
{ path: '', redirectTo: 'home', pathMatch: 'full' },
|
{ path: '', redirectTo: 'home', pathMatch: 'full' },
|
||||||
{ path: 'home', component: HomeComponent },
|
{ path: 'home', component: HomeComponent },
|
||||||
@@ -25,4 +26,6 @@ export const sharedConfig: NgModule = {
|
|||||||
{ path: '**', redirectTo: 'home' }
|
{ path: '**', redirectTo: 'home' }
|
||||||
])
|
])
|
||||||
]
|
]
|
||||||
};
|
})
|
||||||
|
export class AppModule {
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user