@@ -70,37 +70,31 @@ allowedOrigins =
7070endpointV1 :: A.Artifacts -> Snap ()
7171endpointV1 artifacts =
7272 endpoint artifacts $ \source outcome ->
73− do modifyResponse $ setContentType "text/html; charset=utf-8"
74− case outcome of
75− Success builder ->
76− writeBuilder builder
73+ case outcome of
74+ Success name builder ->
75+ writeBuilder (Html.sandwich name builder)
7776
78− NoMain ->
79− writeBuilder $ renderHtmlReport noMain
77+ NoMain ->
78+ writeBuilder $ renderV1ProblemReport noMain
8079
81− BadInput name err ->
82− writeBuilder $ renderHtmlReport $
83− Help.compilerReport "/" (Error.Module name "/try" File.zeroTime source err) []
80+ BadInput name err ->
81+ writeBuilder $ renderV1ProblemReport $
82+ Help.compilerReport "/" (Error.Module name "/try" File.zeroTime source err) []
8483
8584
8685endpointV2 :: A.Artifacts -> Snap ()
8786endpointV2 artifacts =
8887 endpoint artifacts $ \source outcome ->
8988 case outcome of
90− Success builder ->
91− do modifyResponse $ setContentType "text/html; charset=utf-8"
92− writeBuilder builder
89+ Success name builder ->
90+ writeBuilder (renderV2SuccessReport name builder)
9391
9492 NoMain ->
95− do modifyResponse $ setResponseStatus 400 "Bad Request"
96− modifyResponse $ setContentType "text/json; charset=utf-8"
97− writeBuilder $ renderJsonReport noMain
93+ writeBuilder $ renderV2ProblemReport noMain
9894
9995 BadInput name err ->
100− do modifyResponse $ setResponseStatus 400 "Bad Request"
101− modifyResponse $ setContentType "text/json; charset=utf-8"
102− writeBuilder $ renderJsonReport $
103− Help.compilerReport "/" (Error.Module name "/try" File.zeroTime source err) []
96+ writeBuilder $ renderV2ProblemReport $
97+ Help.compilerReport "/" (Error.Module name "/try" File.zeroTime source err) []
10498
10599
106100endpoint :: A.Artifacts -> (B.ByteString -> Outcome -> Snap ()) -> Snap ()
@@ -109,7 +103,8 @@ endpoint artifacts respondToOutcome =
109103 do result <- foldMultipart defaultUploadPolicy ignoreFile 0
110104 case result of
111105 ([("code",source)], 0) ->
112− respondToOutcome source (compile artifacts source)
106+ do modifyResponse $ setContentType "text/html; charset=utf-8"
107+ respondToOutcome source (compile artifacts source)
113108
114109 _ ->
115110 do modifyResponse $ setResponseStatus 400 "Bad Request"
@@ -131,7 +126,7 @@ ignoreFile _ _ count =
131126
132127
133128data Outcome
134− = Success B.Builder
129+ = Success N.Name B.Builder
135130 | NoMain
136131 | BadInput ModuleName.Raw Error.Error
137132
@@ -165,7 +160,7 @@ compile (A.Artifacts interfaces objects) source =
165160 mains = Map.singleton home main_
166161 graph = Opt.addLocalGraph locals objects
167162 in
168− Success $ Html.sandwich name $ JS.generate mode graph mains
163+ Success name $ JS.generate mode graph mains
169164
170165
171166checkImports :: Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Either (NE.List Import.Error) (Map.Map ModuleName.Raw I.Interface)
@@ -193,13 +188,65 @@ checkImports interfaces imports =
193188-- RENDER REPORT
194189
195190
196−renderJsonReport :: Help.Report -> B.Builder
197−renderJsonReport report =
198− Encode.encodeUgly (Exit.toJson report)
191+renderV2ProblemReport :: Help.Report -> B.Builder
192+renderV2ProblemReport report =
193+ [r|<!DOCTYPE HTML>
194+<html>
195+<head>
196+ <meta charset="UTF-8">
197+ <style>body { padding: 0; margin: 0; display: none; }</style>
198+</head>
199+<body>
200+ <script>
201+ var errors = |] <> Encode.encodeUgly (Exit.toJson report) <> [r|;
202+ window.parent.postMessage(JSON.stringify(errors), '*');
203+ </script>
204+</body>
205+</html>|]
206+
207+
208+renderV2SuccessReport :: N.Name -> B.Builder -> B.Builder
209+renderV2SuccessReport moduleName javascript =
210+ let name = N.toBuilder moduleName in
211+ [r|<!DOCTYPE HTML>
212+<html>
213+<head>
214+ <meta charset="UTF-8">
215+ <title>|] <> name <> [r|</title>
216+ <style>body { padding: 0; margin: 0; }</style>
217+</head>
218+
219+<body>
220+
221+<pre id="elm"></pre>
222+
223+<script>
224+window.parent.postMessage("SUCCESS", '*');
225+
226+try {
227+|] <> javascript <> [r|
228+
229+ var app = Elm.|] <> name <> [r|.init({ node: document.getElementById("elm") });
230+}
231+catch (e)
232+{
233+ // display initialization errors (e.g. bad flags, infinite recursion)
234+ var header = document.createElement("h1");
235+ header.style.fontFamily = "monospace";
236+ header.innerText = "Initialization Error";
237+ var pre = document.getElementById("elm");
238+ document.body.insertBefore(header, pre);
239+ pre.innerText = e;
240+ throw e;
241+}
242+</script>
243+
244+</body>
245+</html>|]
199246
200247
201−renderHtmlReport :: Help.Report -> B.Builder
202−renderHtmlReport report =
248+renderV1ProblemReport :: Help.Report -> B.Builder
249+renderV1ProblemReport report =
203250 [r|<!DOCTYPE HTML>
204251<html>
205252<head>