├── .gitignore
├── LICENSE.md
├── README.md
├── WebSharper.Warp.Test
├── App.config
├── Program.fs
└── WebSharper.Warp.Test.fsproj
├── WebSharper.Warp.sln
├── WebSharper.Warp
├── Warp.fs
├── Warp.fsi
├── WebSharper.Warp.fsproj
├── reference-nover.fsx
└── reference.fsx
├── build.cmd
├── build.fsx
├── build.sh
├── getting-started.md
├── ivy.xml
├── readme.txt.in
└── tools
├── NuGet
└── NuGet.exe
└── includes.fsx
/.gitignore:
--------------------------------------------------------------------------------
1 | tools/packages/
2 | packages/
3 | build/
4 | bin/
5 | obj/
6 | *.suo
7 | */Scripts/WebSharper/
8 | */Content/WebSharper/
9 | readme.txt
10 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | # Apache License
2 |
3 | Version 2.0, January 2004
4 |
5 | http://www.apache.org/licenses/
6 |
7 | ## TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
8 |
9 | 1. Definitions.
10 |
11 | "License" shall mean the terms and conditions for use, reproduction,
12 | and distribution as defined by Sections 1 through 9 of this document.
13 |
14 | "Licensor" shall mean the copyright owner or entity authorized by
15 | the copyright owner that is granting the License.
16 |
17 | "Legal Entity" shall mean the union of the acting entity and all
18 | other entities that control, are controlled by, or are under common
19 | control with that entity. For the purposes of this definition,
20 | "control" means (i) the power, direct or indirect, to cause the
21 | direction or management of such entity, whether by contract or
22 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
23 | outstanding shares, or (iii) beneficial ownership of such entity.
24 |
25 | "You" (or "Your") shall mean an individual or Legal Entity
26 | exercising permissions granted by this License.
27 |
28 | "Source" form shall mean the preferred form for making modifications,
29 | including but not limited to software source code, documentation
30 | source, and configuration files.
31 |
32 | "Object" form shall mean any form resulting from mechanical
33 | transformation or translation of a Source form, including but
34 | not limited to compiled object code, generated documentation,
35 | and conversions to other media types.
36 |
37 | "Work" shall mean the work of authorship, whether in Source or
38 | Object form, made available under the License, as indicated by a
39 | copyright notice that is included in or attached to the work
40 | (an example is provided in the Appendix below).
41 |
42 | "Derivative Works" shall mean any work, whether in Source or Object
43 | form, that is based on (or derived from) the Work and for which the
44 | editorial revisions, annotations, elaborations, or other modifications
45 | represent, as a whole, an original work of authorship. For the purposes
46 | of this License, Derivative Works shall not include works that remain
47 | separable from, or merely link (or bind by name) to the interfaces of,
48 | the Work and Derivative Works thereof.
49 |
50 | "Contribution" shall mean any work of authorship, including
51 | the original version of the Work and any modifications or additions
52 | to that Work or Derivative Works thereof, that is intentionally
53 | submitted to Licensor for inclusion in the Work by the copyright owner
54 | or by an individual or Legal Entity authorized to submit on behalf of
55 | the copyright owner. For the purposes of this definition, "submitted"
56 | means any form of electronic, verbal, or written communication sent
57 | to the Licensor or its representatives, including but not limited to
58 | communication on electronic mailing lists, source code control systems,
59 | and issue tracking systems that are managed by, or on behalf of, the
60 | Licensor for the purpose of discussing and improving the Work, but
61 | excluding communication that is conspicuously marked or otherwise
62 | designated in writing by the copyright owner as "Not a Contribution."
63 |
64 | "Contributor" shall mean Licensor and any individual or Legal Entity
65 | on behalf of whom a Contribution has been received by Licensor and
66 | subsequently incorporated within the Work.
67 |
68 | 2. Grant of Copyright License. Subject to the terms and conditions of
69 | this License, each Contributor hereby grants to You a perpetual,
70 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
71 | copyright license to reproduce, prepare Derivative Works of,
72 | publicly display, publicly perform, sublicense, and distribute the
73 | Work and such Derivative Works in Source or Object form.
74 |
75 | 3. Grant of Patent License. Subject to the terms and conditions of
76 | this License, each Contributor hereby grants to You a perpetual,
77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
78 | (except as stated in this section) patent license to make, have made,
79 | use, offer to sell, sell, import, and otherwise transfer the Work,
80 | where such license applies only to those patent claims licensable
81 | by such Contributor that are necessarily infringed by their
82 | Contribution(s) alone or by combination of their Contribution(s)
83 | with the Work to which such Contribution(s) was submitted. If You
84 | institute patent litigation against any entity (including a
85 | cross-claim or counterclaim in a lawsuit) alleging that the Work
86 | or a Contribution incorporated within the Work constitutes direct
87 | or contributory patent infringement, then any patent licenses
88 | granted to You under this License for that Work shall terminate
89 | as of the date such litigation is filed.
90 |
91 | 4. Redistribution. You may reproduce and distribute copies of the
92 | Work or Derivative Works thereof in any medium, with or without
93 | modifications, and in Source or Object form, provided that You
94 | meet the following conditions:
95 |
96 | (a) You must give any other recipients of the Work or
97 | Derivative Works a copy of this License; and
98 |
99 | (b) You must cause any modified files to carry prominent notices
100 | stating that You changed the files; and
101 |
102 | (c) You must retain, in the Source form of any Derivative Works
103 | that You distribute, all copyright, patent, trademark, and
104 | attribution notices from the Source form of the Work,
105 | excluding those notices that do not pertain to any part of
106 | the Derivative Works; and
107 |
108 | (d) If the Work includes a "NOTICE" text file as part of its
109 | distribution, then any Derivative Works that You distribute must
110 | include a readable copy of the attribution notices contained
111 | within such NOTICE file, excluding those notices that do not
112 | pertain to any part of the Derivative Works, in at least one
113 | of the following places: within a NOTICE text file distributed
114 | as part of the Derivative Works; within the Source form or
115 | documentation, if provided along with the Derivative Works; or,
116 | within a display generated by the Derivative Works, if and
117 | wherever such third-party notices normally appear. The contents
118 | of the NOTICE file are for informational purposes only and
119 | do not modify the License. You may add Your own attribution
120 | notices within Derivative Works that You distribute, alongside
121 | or as an addendum to the NOTICE text from the Work, provided
122 | that such additional attribution notices cannot be construed
123 | as modifying the License.
124 |
125 | You may add Your own copyright statement to Your modifications and
126 | may provide additional or different license terms and conditions
127 | for use, reproduction, or distribution of Your modifications, or
128 | for any such Derivative Works as a whole, provided Your use,
129 | reproduction, and distribution of the Work otherwise complies with
130 | the conditions stated in this License.
131 |
132 | 5. Submission of Contributions. Unless You explicitly state otherwise,
133 | any Contribution intentionally submitted for inclusion in the Work
134 | by You to the Licensor shall be under the terms and conditions of
135 | this License, without any additional terms or conditions.
136 | Notwithstanding the above, nothing herein shall supersede or modify
137 | the terms of any separate license agreement you may have executed
138 | with Licensor regarding such Contributions.
139 |
140 | 6. Trademarks. This License does not grant permission to use the trade
141 | names, trademarks, service marks, or product names of the Licensor,
142 | except as required for reasonable and customary use in describing the
143 | origin of the Work and reproducing the content of the NOTICE file.
144 |
145 | 7. Disclaimer of Warranty. Unless required by applicable law or
146 | agreed to in writing, Licensor provides the Work (and each
147 | Contributor provides its Contributions) on an "AS IS" BASIS,
148 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
149 | implied, including, without limitation, any warranties or conditions
150 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
151 | PARTICULAR PURPOSE. You are solely responsible for determining the
152 | appropriateness of using or redistributing the Work and assume any
153 | risks associated with Your exercise of permissions under this License.
154 |
155 | 8. Limitation of Liability. In no event and under no legal theory,
156 | whether in tort (including negligence), contract, or otherwise,
157 | unless required by applicable law (such as deliberate and grossly
158 | negligent acts) or agreed to in writing, shall any Contributor be
159 | liable to You for damages, including any direct, indirect, special,
160 | incidental, or consequential damages of any character arising as a
161 | result of this License or out of the use or inability to use the
162 | Work (including but not limited to damages for loss of goodwill,
163 | work stoppage, computer failure or malfunction, or any and all
164 | other commercial damages or losses), even if such Contributor
165 | has been advised of the possibility of such damages.
166 |
167 | 9. Accepting Warranty or Additional Liability. While redistributing
168 | the Work or Derivative Works thereof, You may choose to offer,
169 | and charge a fee for, acceptance of support, warranty, indemnity,
170 | or other liability obligations and/or rights consistent with this
171 | License. However, in accepting such obligations, You may act only
172 | on Your own behalf and on Your sole responsibility, not on behalf
173 | of any other Contributor, and only if You agree to indemnify,
174 | defend, and hold each Contributor harmless for any liability
175 | incurred by, or claims asserted against, such Contributor by reason
176 | of your accepting any such warranty or additional liability.
177 |
178 | ## END OF TERMS AND CONDITIONS
179 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # websharper.warp
2 |
3 | [](https://gitter.im/intellifactory/websharper.warp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4 |
5 | WebSharper Warp is a friction-less web development library for building **scripted** and **standalone** **full-stack** F# client-server applications. Warp is built on top of WebSharper and is designed to help you become more productive in these scenarios by providing an API for on-the-fly compilation and an OWIN compliant server middleware for self-hosting or embedding sitelets in various compatible web servers.
6 |
7 | **Update**: Note that many Warp shorthands have been integrated into WebSharper now. To use these new shorthands, you don't need Warp, but be sure to open `WebSharper.Sitelets` instead. (You can find the old getting started guide that uses Warp [here](getting-started.md)).
8 |
9 | * `Warp.Page` -> `Content.Page`
10 | * `Warp.Text` -> `Content.Text`
11 | * `Warp.Json` -> `Content.Json`
12 | * `Warp.CreateSPA` -> `Application.SinglePage`
13 | * `Warp.CreateApplication` -> `Application.MultiPage`
14 |
15 | # Installing
16 |
17 | To get started with Warp is super-easy, all you need is to open a new F# Console Application (or any other F# project type if you want to script applications), and add `WebSharper.Warp` to it:
18 |
19 | ```
20 | Install-Package WebSharper.Warp
21 | ```
22 |
23 | Or if you use [Paket](http://fsprojects.github.io/Paket/):
24 |
25 | ```
26 | paket init
27 | paket add nuget WebSharper.Warp
28 | ```
29 |
30 | # Scripting with Warp
31 |
32 | When you add the `WebSharper.Warp` NuGet package to your project in Visual Studio, a new document tab will open giving the necessary boilerplate for using Warp in scripted applications.
33 |
34 | For instance, the SPA example above can be written as an F# script and executed in F# Interative:
35 |
36 | ```fsharp
37 | #I "../packages/Owin.1.0/lib/net40"
38 | #I "../packages/Microsoft.Owin.3.0.1/lib/net45"
39 | #I "../packages/Microsoft.Owin.Host.HttpListener.3.0.1/lib/net45"
40 | #I "../packages/Microsoft.Owin.Hosting.3.0.1/lib/net45"
41 | #I "../packages/Microsoft.Owin.FileSystems.3.0.1/lib/net45"
42 | #I "../packages/Microsoft.Owin.StaticFiles.3.0.1/lib/net45"
43 | #I "../packages/WebSharper.3.2.8.170/lib/net40"
44 | #I "../packages/WebSharper.Compiler.3.2.4.170/lib/net40"
45 | #I "../packages/WebSharper.Owin.3.2.6.83/lib/net45"
46 | #load "../packages/WebSharper.Warp.3.2.10.13/tools/reference.fsx"
47 |
48 | open WebSharper
49 | open WebSharper.Html.Server
50 |
51 | let MySite =
52 | Warp.CreateSPA (fun ctx ->
53 | [H1 [Text "Hello world!"]])
54 |
55 | do Warp.RunAndWaitForInput(MySite) |> ignore
56 | ```
57 |
58 | If you use Paket, then you should replace the `#`-lines above with this one:
59 |
60 | ```fsharp
61 | #load "../packages/WebSharper.Warp/tools/reference-nover.fsx"
62 | ```
63 |
64 | In FSI, you should see:
65 |
66 | ```
67 | --> Added 'c:\sandbox\test\Library1\HelloWorld\../packages/Owin.1.0/lib/net40' to library include path
68 | [... more lines ...]
69 |
70 | [Loading c:\sandbox\test\Library1\packages\WebSharper.Warp.3.2.10.13\tools\reference.fsx]
71 |
72 | namespace FSI_0004
73 |
74 | Serving http://localhost:9000/, press Enter to stop.
75 | ```
76 |
77 | You can then test this application as before:
78 |
79 | 
80 |
--------------------------------------------------------------------------------
/WebSharper.Warp.Test/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/WebSharper.Warp.Test/Program.fs:
--------------------------------------------------------------------------------
1 | namespace WebSharper.Warp.Test
2 |
3 | open WebSharper
4 | open WebSharper.Sitelets
5 |
6 | type EndPoints =
7 | | [] Index
8 |
9 | []
10 | module Client =
11 |
12 | open WebSharper.Html.Client
13 | open WebSharper.JavaScript
14 |
15 | let Content () =
16 | Button [Text "Click me!"]
17 | |>! OnClick (fun _ _ ->
18 | JS.Alert "Clicked!")
19 |
20 | module Server =
21 |
22 | open WebSharper.Html.Server
23 |
24 | let app =
25 | Application.MultiPage(fun ctx endpoint ->
26 | match endpoint with
27 | | EndPoints.Index ->
28 | Content.Page(
29 | Title = "Welcome to my site!",
30 | Body = [
31 | Div [Text (System.DateTime.UtcNow.ToString())]
32 | Div [ClientSide <@ Client.Content () @>]
33 | ]
34 | )
35 | )
36 |
37 | []
38 | let main argv =
39 | Warp.RunAndWaitForInput(app, urls = ["http://localhost:9000"; "http://127.0.0.1:9000"])
40 |
--------------------------------------------------------------------------------
/WebSharper.Warp.Test/WebSharper.Warp.Test.fsproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | 2.0
8 | 1208759e-f34b-40c2-9900-73c370a0934a
9 | Exe
10 | WebSharper.Warp.Test
11 | WebSharper.Warp.Test
12 | v4.5
13 | true
14 | 4.3.1.0
15 | WebSharper.Warp.Test
16 |
17 |
18 | true
19 | full
20 | false
21 | false
22 | bin\Debug\
23 | DEBUG;TRACE
24 | 3
25 | AnyCPU
26 | bin\Debug\WebSharper.Warp.Test.XML
27 | true
28 |
29 |
30 | pdbonly
31 | true
32 | true
33 | bin\Release\
34 | TRACE
35 | 3
36 | AnyCPU
37 | bin\Release\WebSharper.Warp.Test.XML
38 | true
39 |
40 |
41 |
42 |
43 |
44 |
45 | 11
46 |
47 |
48 |
49 |
50 | $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets
51 |
52 |
53 |
54 |
55 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/WebSharper.Warp.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2013
4 | VisualStudioVersion = 12.0.31101.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "WebSharper.Warp", "WebSharper.Warp\WebSharper.Warp.fsproj", "{4BD496F1-B318-4669-82C7-A45734F46A30}"
7 | EndProject
8 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "WebSharper.Warp.Test", "WebSharper.Warp.Test\WebSharper.Warp.Test.fsproj", "{1208759E-F34B-40C2-9900-73C370A0934A}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {4BD496F1-B318-4669-82C7-A45734F46A30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {4BD496F1-B318-4669-82C7-A45734F46A30}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {4BD496F1-B318-4669-82C7-A45734F46A30}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {4BD496F1-B318-4669-82C7-A45734F46A30}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {1208759E-F34B-40C2-9900-73C370A0934A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {1208759E-F34B-40C2-9900-73C370A0934A}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {1208759E-F34B-40C2-9900-73C370A0934A}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {1208759E-F34B-40C2-9900-73C370A0934A}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | EndGlobal
29 |
--------------------------------------------------------------------------------
/WebSharper.Warp/Warp.fs:
--------------------------------------------------------------------------------
1 | namespace WebSharper
2 |
3 | open System
4 | open System.Collections.Generic
5 | open System.IO
6 | open System.Reflection
7 | open System.Runtime.CompilerServices
8 | open System.Threading.Tasks
9 | open WebSharper.Sitelets
10 | open global.Owin
11 | open Microsoft.Owin.Hosting
12 | open Microsoft.Owin.StaticFiles
13 | open Microsoft.Owin.FileSystems
14 | open WebSharper
15 | open WebSharper.Owin
16 | open WebSharper.Html.Server
17 |
18 | []
19 | module Extensions =
20 | open WebSharper.Html.Server
21 |
22 | type Sitelets.Page with
23 | member this.WithStyleSheet (href: string) =
24 | let css = Link [Rel "stylesheet"; HRef href]
25 | { this with
26 | Head = Seq.append this.Head [css]
27 | }
28 |
29 | member this.WithJavaScript (href: string) =
30 | let css = Script [Type "text/javascript"; Src href]
31 | { this with
32 | Head = Seq.append this.Head [css]
33 | }
34 |
35 | module SPA =
36 | type EndPoint =
37 | | [] Home
38 |
39 | module internal Compilation =
40 |
41 | module PC = WebSharper.PathConventions
42 |
43 | open System.Reflection
44 | open IntelliFactory.Core
45 | module FE = WebSharper.Compiler.FrontEnd
46 |
47 | type CompiledAssembly =
48 | {
49 | ReadableJavaScript : string
50 | CompressedJavaScript : string
51 | Info : WebSharper.Core.Metadata.Info
52 | References : list
53 | }
54 |
55 | let websharperDir = lazy (Path.GetDirectoryName typeof>.Assembly.Location)
56 |
57 | let getRefs (loader: Compiler.Loader) =
58 | [
59 | for dll in Directory.EnumerateFiles(websharperDir.Value, "*.dll") do
60 | if Path.GetFileName(dll) <> "FSharp.Core.dll" then
61 | yield dll
62 | let dontRef (n: string) =
63 | [
64 | "FSharp.Compiler.Interactive.Settings,"
65 | "FSharp.Compiler.Service,"
66 | "FSharp.Core,"
67 | "FSharp.Data.TypeProviders,"
68 | "Mono.Cecil"
69 | "mscorlib,"
70 | "System."
71 | "System,"
72 | ] |> List.exists n.StartsWith
73 | let rec loadRefs (asms: Assembly[]) (loaded: Map) =
74 | let refs =
75 | asms
76 | |> Seq.collect (fun asm -> asm.GetReferencedAssemblies())
77 | |> Seq.map (fun n -> n.FullName)
78 | |> Seq.distinct
79 | |> Seq.filter (fun n -> not (dontRef n || Map.containsKey n loaded))
80 | |> Seq.choose (fun n ->
81 | try Some (AppDomain.CurrentDomain.Load n)
82 | with _ -> None)
83 | |> Array.ofSeq
84 | if Array.isEmpty refs then
85 | loaded
86 | else
87 | (loaded, refs)
88 | ||> Array.fold (fun loaded r -> Map.add r.FullName r loaded)
89 | |> loadRefs refs
90 | let asms =
91 | AppDomain.CurrentDomain.GetAssemblies()
92 | |> Array.append (AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies())
93 | |> Array.filter (fun a -> not (dontRef a.FullName))
94 | yield! asms
95 | |> Array.map (fun asm -> asm.FullName, asm)
96 | |> Map.ofArray
97 | |> loadRefs asms
98 | |> Seq.choose (fun (KeyValue(n, asm)) ->
99 | try Some asm.Location
100 | with :? NotSupportedException ->
101 | // The dynamic assembly does not support `.Location`.
102 | // No problem, if it's from the dynamic assembly then
103 | // it doesn't incur a dependency anyway.
104 | None)
105 | ]
106 | |> Seq.distinctBy Path.GetFileName
107 | |> Seq.map loader.LoadFile
108 | |> Seq.toList
109 |
110 | let getLoader() =
111 | let localDir = Directory.GetCurrentDirectory()
112 | let fsharpDir = Path.GetDirectoryName typeof