@@ -1,7 +1,8 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings, QuasiQuotes #-}
2{-# LANGUAGE OverloadedStrings, QuasiQuotes #-}
3module Endpoint.Compile
3module Endpoint.Compile
4− ( endpoint
4+ ( endpoint_V1
5 , loadErrorJS
6 , loadErrorJS
@@ -63,26 +64,50 @@ allowedOrigins =
70+endpoint_V1 :: A.Artifacts -> Snap ()
71+endpoint_V1 artifacts =
72+ endpoint artifacts $ \result ->
74+ Ok name js -> writeBuilder $ Html.sandwich name js
75+ Err report -> writeBuilder $ renderProblem_V1 report
82+endpoint_V2 :: A.Artifacts -> Snap ()
83+endpoint_V2 artifacts =
84+ endpoint artifacts $ \result ->
86+ Ok name js -> writeBuilder $ renderSuccess_V2 name js
87+ Err report -> writeBuilder $ renderProblem_V2 report
66-- ENDPOINT
91-- ENDPOINT
95+ = Ok N.Name B.Builder
69−endpoint :: A.Artifacts -> Snap ()
99+endpoint :: A.Artifacts -> (Result -> Snap ()) -> Snap ()
70−endpoint artifacts =
100+endpoint artifacts callback =
71 Cors.allow POST allowedOrigins $
101 Cors.allow POST allowedOrigins $
72 do result <- foldMultipart defaultUploadPolicy ignoreFile 0
102 do result <- foldMultipart defaultUploadPolicy ignoreFile 0
73 case result of
103 case result of
74 ([("code",source)], 0) ->
104 ([("code",source)], 0) ->
75 do modifyResponse $ setContentType "text/html; charset=utf-8"
105 do modifyResponse $ setContentType "text/html; charset=utf-8"
76− case compile artifacts source of
107+ case compile artifacts source of
77− Success builder ->
108+ Success name js -> Ok name js
80− NoMain ->
109+ NoMain -> Err noMain
81− writeBuilder $ renderReport noMain
84− writeBuilder $ renderReport $
85− Help.compilerReport "/" (Error.Module name "/try" File.zeroTime source err) []
110+ BadInput name err -> Err $ Help.compilerReport "/" (Error.Module name "/try" File.zeroTime source err) []
88 do modifyResponse $ setResponseStatus 400 "Bad Request"
113 do modifyResponse $ setResponseStatus 400 "Bad Request"
@@ -104,7 +129,7 @@ ignoreFile _ _ count =
106data Outcome
131data Outcome
107− = Success B.Builder
132+ = Success N.Name B.Builder
109 | BadInput ModuleName.Raw Error.Error
134 | BadInput ModuleName.Raw Error.Error
@@ -138,7 +163,7 @@ compile (A.Artifacts interfaces objects) source =
138 mains = Map.singleton home main_
163 mains = Map.singleton home main_
139 graph = Opt.addLocalGraph locals objects
164 graph = Opt.addLocalGraph locals objects
141− Success $ Html.sandwich name $ JS.generate mode graph mains
166+ Success name $ JS.generate mode graph mains
144checkImports :: Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Either (NE.List Import.Error) (Map.Map ModuleName.Raw I.Interface)
169checkImports :: Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Either (NE.List Import.Error) (Map.Map ModuleName.Raw I.Interface)
@@ -163,11 +188,11 @@ checkImports interfaces imports =
166−-- RENDER REPORT
191+-- RENDER PROBLEM (V1)
169−renderReport :: Help.Report -> B.Builder
194+renderProblem_V1 :: Help.Report -> B.Builder
170−renderReport report =
195+renderProblem_V1 report =
171 [r|<!DOCTYPE HTML>
196 [r|<!DOCTYPE HTML>
@@ -179,7 +204,7 @@ renderReport report =
180 var app = Elm.Errors.init({flags:|] <> Encode.encodeUgly (Exit.toJson report) <> [r|});
205 var app = Elm.Errors.init({flags:|] <> Encode.encodeUgly (Exit.toJson report) <> [r|});
181 app.ports.jumpTo.subscribe(function(region) {
206 app.ports.jumpTo.subscribe(function(region) {
182− window.parent.postMessage(JSON.stringify(region), '*');
207+ window.parent.postMessage(JSON.stringify(region), "*");
184 </script>
209 </script>
@@ -187,6 +212,71 @@ renderReport report =
215+-- RENDER SUCCESS (V2)
218+renderSuccess_V2 :: N.Name -> B.Builder -> B.Builder
219+renderSuccess_V2 moduleName javascript =
220+ let name = N.toBuilder moduleName in
224+ <meta charset="UTF-8">
225+ <title>|] <> name <> [r|</title>
226+ <style>body { padding: 0; margin: 0; }</style>
234+window.parent.postMessage("SUCCESS", "*");
237+|] <> javascript <> [r|
239+ var app = Elm.|] <> name <> [r|.init({ node: document.getElementById("elm") });
243+ // display initialization errors (e.g. bad flags, infinite recursion)
244+ var header = document.createElement("h1");
245+ header.style.fontFamily = "monospace";
246+ header.innerText = "Initialization Error";
247+ var pre = document.getElementById("elm");
248+ document.body.insertBefore(header, pre);
259+-- RENDER PROBLEM (V2)
262+renderProblem_V2 :: Help.Report -> B.Builder
263+renderProblem_V2 report =
267+ <meta charset="UTF-8">
268+ <style>body { padding: 0; margin: 0; display: none; }</style>
272+ var errors = |] <> Encode.encodeUgly (Exit.toJson report) <> [r|;
273+ window.parent.postMessage(JSON.stringify(errors), "*");
190-- NO MAIN
280-- NO MAIN