on master help sign in
Have terminal/ and browser/ for CLI and reactor
6dbf13bEvan Czaplicki
browser/assets/favicon.iconew file

Binary file not shown.

browser/assets/source-code-pro.ttfnew file

Binary file not shown.

browser/assets/source-sans-pro.ttfnew file

Binary file not shown.

browser/assets/styles.cssnew file+246
@@ -0,0 +1,246 @@
1+@charset "UTF-8";
2+
3+
4+/* FONTS */
5+
6+@font-face {
7+ font-family: 'Source Code Pro';
8+ font-style: normal;
9+ font-weight: 400;
10+ src: local('Source Code Pro'), local('SourceCodePro-Regular'), url(/_elm/source-code-pro.ttf) format('truetype');
11+}
12+
13+@font-face {
14+ font-family: 'Source Sans Pro';
15+ font-style: normal;
16+ font-weight: 400;
17+ src: local('Source Sans Pro'), local('SourceSansPro-Regular'), url(/_elm/source-sans-pro.ttf) format('truetype');
18+}
19+
20+
21+/* GENERIC STUFF */
22+
23+html, head, body {
24+ margin: 0;
25+ height: 100%;
26+}
27+
28+body {
29+ font-family: 'Source Sans Pro', 'Trebuchet MS', 'Lucida Grande', 'Bitstream Vera Sans', 'Helvetica Neue', sans-serif;
30+ color: #293c4b;
31+}
32+
33+a {
34+ color: #60B5CC;
35+ text-decoration: none;
36+}
37+
38+a:hover {
39+ text-decoration: underline;
40+}
41+
42+
43+/* INDEX */
44+
45+.header {
46+ width: 100%;
47+ background-color: #60B5CC;
48+ height: 8px;
49+}
50+
51+.content {
52+ width: 960px;
53+ margin-left: auto;
54+ margin-right: auto;
55+}
56+
57+
58+/* COLUMNS */
59+
60+.left-column {
61+ float: left;
62+ width: 600px;
63+ padding-bottom: 80px;
64+}
65+
66+.right-column {
67+ float: right;
68+ width: 300px;
69+ padding-bottom: 80px;
70+}
71+
72+
73+/* BOXES */
74+
75+.box {
76+ border: 1px solid #c7c7c7;
77+ border-radius: 5px;
78+ margin-bottom: 40px;
79+}
80+
81+.box-header {
82+ display: block;
83+ overflow: hidden;
84+ padding: 7px 12px;
85+ background-color: #fafafa;
86+ text-align: center;
87+}
88+
89+.box-item {
90+ display: block;
91+ overflow: hidden;
92+ padding: 7px 12px;
93+ border-top: 1px solid #e1e1e1;
94+}
95+
96+.box-footer {
97+ display: block;
98+ overflow: hidden;
99+ padding: 2px 12px;
100+ border-top: 1px solid #e1e1e1;
101+ text-align: center;
102+ background-color: #fafafa;
103+ height: 16px;
104+}
105+
106+
107+/* ICONS */
108+
109+.icon {
110+ display: inline-block;
111+ vertical-align: middle;
112+ padding-right: 0.5em;
113+}
114+
115+
116+/* PAGES */
117+
118+.page-name {
119+ float: left;
120+}
121+
122+.page-size {
123+ float: right;
124+ color: #293c4b;
125+}
126+
127+.page-size:hover {
128+ color: #60B5CC;
129+}
130+
131+
132+/* START */
133+
134+.start {
135+ width: 500px;
136+ margin-left: auto;
137+ margin-right: auto;
138+}
139+
140+.start code {
141+ font-family: 'Source Code Pro', monospace;
142+ padding: 0;
143+ padding-top: 0.2em;
144+ padding-bottom: 0.2em;
145+ margin: 0;
146+ font-size: 85%;
147+ background-color: rgba(0,0,0,0.04);
148+ border-radius: 3px;
149+}
150+
151+.start code::before, .start code::after {
152+ letter-spacing: -0.2em;
153+ content: "\00a0";
154+}
155+
156+
157+/* START HELLO */
158+
159+.start-hello {
160+ text-align: center;
161+ padding: calc(50vh - 180px) 0;
162+}
163+
164+.start-hello h1 {
165+ font-size: 5em;
166+ margin: 0;
167+}
168+
169+
170+/* START DETAILS */
171+
172+.start-details {
173+ background: rgb(233, 235, 235);
174+ border-top-left-radius: 10px;
175+ border-top-right-radius: 10px;
176+ padding: 1em 2em;
177+}
178+
179+.start-details h2 {
180+ text-align: center;
181+}
182+
183+.start-details li {
184+ padding-bottom: 0.5em;
185+}
186+
187+
188+/* WAITING */
189+
190+.waiting {
191+ width: 100%;
192+ height: 100%;
193+ display: flex;
194+ flex-direction: column;
195+ justify-content: center;
196+ align-items: center;
197+ color: #9A9A9A;
198+}
199+
200+
201+/* NOT FOUND */
202+
203+.not-found {
204+ width: 100%;
205+ height: 100%;
206+ display: flex;
207+ flex-direction: column;
208+ justify-content: center;
209+ align-items: center;
210+ background-color: #F5F5F5;
211+ color: #9A9A9A;
212+}
213+
214+
215+
216+/* BUTTONS */
217+
218+.button {
219+ text-align: center;
220+}
221+
222+.button a {
223+ background-color: #7FD13B;
224+ border-radius: 6px;
225+ min-width: 120px;
226+ padding: 12px 24px;
227+ margin: 12px;
228+ display: inline-block;
229+ color: white;
230+ font-size: 1.5em;
231+ cursor: pointer;
232+}
233+
234+.button a:hover {
235+ color: white;
236+ background-color: #62BC17;
237+ text-decoration: none;
238+}
239+
240+
241+/* POTENTIAL */
242+
243+.potential h1 {
244+ padding-top: 1em;
245+ font-size: 3em;
246+}
browser/assets/waiting.gifnew file

Binary file not shown.

browser/check.pynew file+48
@@ -0,0 +1,48 @@
1+#!/usr/bin/env python
2+
3+import os
4+import sys
5+
6+
7+## FIGURE OUT NEW MODIFICATION TIME
8+
9+def mostRecentModification(directory):
10+ mostRecent = 0
11+
12+ for dirpath, dirs, files in os.walk(directory):
13+ for f in files:
14+ lastModified = os.path.getmtime(dirpath + '/' + f)
15+ mostRecent = max(int(lastModified), mostRecent)
16+
17+ return mostRecent
18+
19+
20+srcTime = mostRecentModification('ui/src')
21+assetTime = mostRecentModification('ui/assets')
22+mostRecent = max(srcTime, assetTime)
23+
24+
25+## FIGURE OUT OLD MODIFICATION TIME
26+
27+with open('ui/last-modified', 'a') as handle:
28+ pass
29+
30+
31+prevMostRecent = 0
32+
33+
34+with open('ui/last-modified', 'r+') as handle:
35+ line = handle.read()
36+ prevMostRecent = int(line) if line else 0
37+
38+
39+## TOUCH FILES IF NECESSARY
40+
41+if mostRecent > prevMostRecent:
42+ print "+------------------------------------------------------------+"
43+ print "| Some ui/ code changed. Touching src/Reactor/StaticFiles.hs |"
44+ print "| to trigger a recompilation of the Template Haskell stuff. |"
45+ print "+------------------------------------------------------------+"
46+ os.utime('src/Reactor/StaticFiles.hs', None)
47+ with open('ui/last-modified', 'w') as handle:
48+ handle.write(str(mostRecent))
browser/elm.jsonnew file+22
@@ -0,0 +1,22 @@
1+{
2+ "type": "browser",
3+ "source-directories": [
4+ "src"
5+ ],
6+ "elm-version": "0.19.0",
7+ "dependencies": {
8+ "elm-explorations/markdown": "1.0.0",
9+ "elm-lang/core": "6.0.0",
10+ "elm-lang/html": "3.0.0",
11+ "elm-lang/http": "2.0.0",
12+ "elm-lang/json": "1.0.0",
13+ "elm-lang/project-metadata-utils": "1.0.0",
14+ "elm-lang/svg": "3.0.0"
15+ },
16+ "test-dependencies": {},
17+ "do-not-edit-this-by-hand": {
18+ "transitive-dependencies": {
19+ "elm-lang/virtual-dom": "3.0.0"
20+ }
21+ }
22+}
browser/src/Errors.elmnew file+145
@@ -0,0 +1,145 @@
1+module Errors exposing (main)
2+
3+import Char
4+import Html exposing (..)
5+import Html.Attributes exposing (..)
6+import String
7+
8+
9+
10+main =
11+ Html.programWithFlags
12+ { init = init
13+ , update = update
14+ , view = view
15+ , subscriptions = always Sub.none
16+ }
17+
18+
19+
20+-- MODEL
21+
22+
23+type alias Model =
24+ String
25+
26+
27+init : String -> (Model, Cmd msg)
28+init errorMessage =
29+ (errorMessage, Cmd.none)
30+
31+
32+
33+-- UPDATE
34+
35+
36+update : msg -> Model -> (Model, Cmd msg)
37+update _ model =
38+ (model, Cmd.none)
39+
40+
41+
42+-- VIEW
43+
44+
45+view : Model -> Html msg
46+view model =
47+ div
48+ [ style "width" "100%"
49+ , style "min-height" "100%"
50+ , style "display" "flex"
51+ , style "flex-direction" "column"
52+ , style "align-items" "center"
53+ , style "background-color" "black"
54+ , style "color" "rgb(233, 235, 235)"
55+ , style "font-family" "monospace"
56+ ]
57+ [ div
58+ [ style "display" "block"
59+ , style "white-space" "pre"
60+ , style "background-color" "rgb(39, 40, 34)"
61+ , style "padding" "2em"
62+ ]
63+ (addColors model)
64+ ]
65+
66+
67+addColors : String -> List (Html msg)
68+addColors message =
69+ message
70+ |> String.lines
71+ |> List.concatMap addColorToLine
72+
73+
74+addColorToLine : String -> List (Html msg)
75+addColorToLine line =
76+ flip (++) [ text "\n" ] <|
77+ if isBreaker line then
78+ [ colorful "rgb(51, 187, 200)" ("\n\n" ++ line) ]
79+
80+ else if isBigBreaker line then
81+ [ colorful "rgb(211, 56, 211)" line ]
82+
83+ else if isUnderline line then
84+ [ colorful "#D5200C" line ]
85+
86+ else if String.startsWith " " line then
87+ [ colorful "#9A9A9A" line ]
88+
89+ else
90+ processLine line
91+
92+
93+colorful : String -> String -> Html msg
94+colorful color msg =
95+ span [ style "color" color ] [ text msg ]
96+
97+
98+isBreaker : String -> Bool
99+isBreaker line =
100+ String.startsWith "-- " line
101+ &&
102+ String.contains "----------" line
103+
104+
105+isBigBreaker : String -> Bool
106+isBigBreaker line =
107+ String.startsWith "===============" line
108+
109+
110+isUnderline : String -> Bool
111+isUnderline line =
112+ String.all (\c -> c == ' ' || c == '^') line
113+
114+
115+isLineNumber : String -> Bool
116+isLineNumber string =
117+ String.all (\c -> c == ' ' || Char.isDigit c) string
118+
119+
120+processLine : String -> List (Html msg)
121+processLine line =
122+ case String.split "|" line of
123+ [] ->
124+ [ text line ]
125+
126+ starter :: rest ->
127+ if not (isLineNumber starter) then
128+ [ text line ]
129+
130+ else
131+ let
132+ restOfLine =
133+ String.join "|" rest
134+
135+ marker =
136+ if String.left 1 restOfLine == ">" then
137+ colorful "#D5200C" ">"
138+
139+ else
140+ text " "
141+ in
142+ [ colorful "#9A9A9A" (starter ++ "|")
143+ , marker
144+ , colorful "#9A9A9A" (String.dropLeft 1 restOfLine)
145+ ]
browser/src/Index.elmnew file+69
@@ -0,0 +1,69 @@
1+module Index exposing (main)
2+
3+import Html exposing (Html)
4+import Json.Decode as Decode
5+
6+import Index.Dashboard as Dashboard
7+import Index.Project as Project exposing (Project)
8+
9+
10+
11+-- MAIN
12+
13+
14+main =
15+ Html.programWithFlags
16+ { init = init
17+ , view = view
18+ , update = update
19+ , subscriptions = subscriptions
20+ }
21+
22+
23+
24+-- MODEL
25+
26+
27+type alias Model =
28+ Project
29+
30+
31+
32+-- INIT
33+
34+
35+init : Decode.Value -> (Model, Cmd msg)
36+init flags =
37+ case Project.decode flags of
38+ Err _ ->
39+ Debug.crash "TODO"
40+
41+ Ok project ->
42+ (project, Cmd.none)
43+
44+
45+
46+-- UPDATE
47+
48+
49+update : msg -> Model -> (Model, Cmd msg)
50+update _ model =
51+ (model, Cmd.none)
52+
53+
54+
55+-- SUBSCRIPTIONS
56+
57+
58+subscriptions : Model -> Sub msg
59+subscriptions model =
60+ Sub.none
61+
62+
63+
64+-- VIEW
65+
66+
67+view : Model -> Html msg
68+view =
69+ Dashboard.view
browser/src/Index/Dashboard.elmnew file+228
@@ -0,0 +1,228 @@
1+module Index.Dashboard exposing
2+ ( view
3+ )
4+
5+
6+import Html exposing (..)
7+import Html.Attributes exposing (class, href, style, title)
8+
9+import Elm.Config as Config exposing (Config)
10+import Elm.License as License
11+import Elm.Repo as Repo exposing (Repo)
12+import Elm.Version as Version exposing (Version)
13+import Index.Icon as Icon
14+import Index.Navigator as Navigator exposing ((</>))
15+import Index.Project as Project exposing (Project, File(..))
16+import Index.Skeleton as Skeleton
17+
18+
19+
20+-- VIEW
21+
22+
23+view : Project -> Html msg
24+view { root, pwd, dirs, files, readme, config } =
25+ Skeleton.view
26+ [ Navigator.view root pwd
27+ , viewLeftColumn dirs files readme
28+ , viewRightColumn config
29+ , clearfix
30+ ]
31+
32+
33+clearfix : Html msg
34+clearfix =
35+ div [ style "clear" "both" ] []
36+
37+
38+
39+-- VIEW LEFT COLUMN
40+
41+
42+viewLeftColumn : List String -> List File -> Maybe String -> Html msg
43+viewLeftColumn dirs files readme =
44+ section [ class "left-column" ]
45+ [ viewFiles dirs files
46+ , viewReadme readme
47+ ]
48+
49+
50+
51+-- VIEW README
52+
53+
54+viewReadme : Maybe String -> Html msg
55+viewReadme readme =
56+ case readme of
57+ Nothing ->
58+ text ""
59+
60+ Just markdown ->
61+ Skeleton.readmeBox markdown
62+
63+
64+
65+-- VIEW FILES
66+
67+
68+viewFiles : List String -> List File -> Html msg
69+viewFiles dirs files =
70+ Skeleton.box
71+ { title = "File Navigation"
72+ , items = List.map viewDir dirs ++ List.map viewFile files
73+ , footer = Nothing
74+ }
75+
76+
77+viewDir : String -> List (Html msg)
78+viewDir dir =
79+ [ a [ href dir ] [ Icon.folder, text dir ]
80+ ]
81+
82+
83+viewFile : File -> List (Html msg)
84+viewFile file =
85+ case file of
86+ HasMain name ->
87+ [ a [ href name ] [ Icon.lookup name, text name ]
88+ ]
89+
90+ NoMain name ->
91+ [ a [ href name ] [ Icon.lookup name, text name ]
92+ ]
93+
94+ Other name ->
95+ [ a [ href name ] [ Icon.lookup name, text name ]
96+ ]
97+
98+
99+
100+-- VIEW RIGHT COLUMN
101+
102+
103+viewRightColumn : Config -> Html msg
104+viewRightColumn config =
105+ div [ class "right-column" ] <|
106+ case config of
107+ Config.App info ->
108+ [ viewPageSummary info.pages
109+ , viewDeps info.dependencies
110+ , viewTestDeps info.testDependencies
111+ ]
112+
113+ Config.Pkg info ->
114+ [ viewPackageSummary info
115+ , viewDeps (exactify info.dependencies)
116+ , viewTestDeps (exactify info.testDependencies)
117+ ]
118+
119+
120+
121+-- VIEW PAGE SUMMARY
122+
123+
124+viewPageSummary : List String -> Html msg
125+viewPageSummary pages =
126+ Skeleton.box
127+ { title = "Pages"
128+ , items = List.map viewPage pages
129+ , footer = Nothing
130+ }
131+
132+
133+viewPage : String -> List (Html msg)
134+viewPage name =
135+ [ div
136+ [ style "float" "left"
137+ ]
138+ [ Icon.gift
139+ , text name
140+ ]
141+ , div
142+ [ style "float" "right"
143+ ]
144+ [ text "7kb"
145+ , bundleSize 10
146+ ]
147+ ]
148+
149+
150+bundleSize : Int -> Html msg
151+bundleSize size =
152+ span
153+ [ style "color" "#e1e1e1"
154+ ]
155+ [ text (" + " ++ String.fromInt size ++ "kb")
156+ ]
157+
158+
159+
160+-- VIEW PACKAGE SUMMARY
161+
162+
163+viewPackageSummary : Config.PkgInfo -> Html msg
164+viewPackageSummary { summary, license, version } =
165+ Skeleton.box
166+ { title = "Package Information"
167+ , items =
168+ [ [ text ("Version: " ++ Version.toString version) ]
169+ , [ text ("License: " ++ license.code) ]
170+ ]
171+ , footer = Nothing
172+ }
173+
174+
175+
176+-- VIEW DEPENDENCIES
177+
178+
179+viewDeps : Config.Deps Version -> Html msg
180+viewDeps deps =
181+ Skeleton.box
182+ { title = "Dependencies"
183+ , items = List.map viewDep deps
184+ , footer =
185+ Just
186+ ( "/_elm/dependencies"
187+ , "Add more dependencies?"
188+ )
189+ }
190+
191+
192+viewTestDeps : Config.Deps Version -> Html msg
193+viewTestDeps deps =
194+ Skeleton.box
195+ { title = "Test Dependencies"
196+ , items = List.map viewDep deps
197+ , footer =
198+ Just
199+ ( "/_elm/test-dependencies"
200+ , "Add more test dependencies?"
201+ )
202+ }
203+
204+
205+viewDep : (Repo, Version) -> List (Html msg)
206+viewDep (repo, version) =
207+ [ div
208+ [ style "float" "left" ]
209+ [ Icon.package
210+ , a [ href (toPackageUrl repo version) ] [ text (Repo.toString repo) ]
211+ ]
212+ , div
213+ [ style "float" "right" ]
214+ [ text (Version.toString version) ]
215+ ]
216+
217+
218+toPackageUrl : Repo -> Version -> String
219+toPackageUrl name version =
220+ "http://package.elm-lang.org/packages"
221+ </> Repo.toString name
222+ </> Version.toString version
223+
224+
225+-- TODO - make this actually work!
226+exactify : Config.Deps a -> Config.Deps Version
227+exactify deps =
228+ List.map (\(name, _) -> (name, Version 0 0 0)) deps
browser/src/Index/Icon.elmnew file+112
@@ -0,0 +1,112 @@
1+module Index.Icon exposing
2+ ( home
3+ , image
4+ , file
5+ , gift
6+ , folder
7+ , package
8+ , plus
9+ , lookup
10+ )
11+
12+import Dict
13+import Html exposing (Html)
14+import Html.Attributes exposing (class)
15+import Svg exposing (..)
16+import Svg.Attributes exposing (width, height, viewBox, d, fill)
17+
18+
19+
20+-- ICON
21+
22+
23+icon : String -> String -> String -> Html msg
24+icon color size path =
25+ svg
26+ [ class "icon"
27+ , width size
28+ , height size
29+ , viewBox "0 0 1792 1792"
30+ ]
31+ [ path [ fill color, d path ] []
32+ ]
33+
34+
35+
36+-- NECESSARY ICONS
37+
38+
39+home : Html msg
40+home =
41+ icon "#babdb6" "36px" "M1472 992v480q0 26-19 45t-45 19h-384v-384h-256v384h-384q-26 0-45-19t-19-45v-480q0-1 .5-3t.5-3l575-474 575 474q1 2 1 6zm223-69l-62 74q-8 9-21 11h-3q-13 0-21-7l-692-577-692 577q-12 8-24 7-13-2-21-11l-62-74q-8-10-7-23.5t11-21.5l719-599q32-26 76-26t76 26l244 204v-195q0-14 9-23t23-9h192q14 0 23 9t9 23v408l219 182q10 8 11 21.5t-7 23.5z"
42+
43+
44+image : Html msg
45+image =
46+ icon "#babdb6" "16px" "M1596 380q28 28 48 76t20 88v1152q0 40-28 68t-68 28h-1344q-40 0-68-28t-28-68v-1600q0-40 28-68t68-28h896q40 0 88 20t76 48zm-444-244v376h376q-10-29-22-41l-313-313q-12-12-41-22zm384 1528v-1024h-416q-40 0-68-28t-28-68v-416h-768v1536h1280zm-128-448v320h-1024v-192l192-192 128 128 384-384zm-832-192q-80 0-136-56t-56-136 56-136 136-56 136 56 56 136-56 136-136 56z"
47+
48+
49+file : Html msg
50+file =
51+ icon "#babdb6" "16px" "M1596 380q28 28 48 76t20 88v1152q0 40-28 68t-68 28h-1344q-40 0-68-28t-28-68v-1600q0-40 28-68t68-28h896q40 0 88 20t76 48zm-444-244v376h376q-10-29-22-41l-313-313q-12-12-41-22zm384 1528v-1024h-416q-40 0-68-28t-28-68v-416h-768v1536h1280zm-1024-864q0-14 9-23t23-9h704q14 0 23 9t9 23v64q0 14-9 23t-23 9h-704q-14 0-23-9t-9-23v-64zm736 224q14 0 23 9t9 23v64q0 14-9 23t-23 9h-704q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h704zm0 256q14 0 23 9t9 23v64q0 14-9 23t-23 9h-704q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h704z"
52+
53+
54+gift : Html msg
55+gift =
56+ icon "#babdb6" "16px" "M1056 1356v-716h-320v716q0 25 18 38.5t46 13.5h192q28 0 46-13.5t18-38.5zm-456-844h195l-126-161q-26-31-69-31-40 0-68 28t-28 68 28 68 68 28zm688-96q0-40-28-68t-68-28q-43 0-69 31l-125 161h194q40 0 68-28t28-68zm376 256v320q0 14-9 23t-23 9h-96v416q0 40-28 68t-68 28h-1088q-40 0-68-28t-28-68v-416h-96q-14 0-23-9t-9-23v-320q0-14 9-23t23-9h440q-93 0-158.5-65.5t-65.5-158.5 65.5-158.5 158.5-65.5q107 0 168 77l128 165 128-165q61-77 168-77 93 0 158.5 65.5t65.5 158.5-65.5 158.5-158.5 65.5h440q14 0 23 9t9 23z"
57+
58+
59+folder : Html msg
60+folder =
61+ icon "#babdb6" "16px" "M1728 608v704q0 92-66 158t-158 66h-1216q-92 0-158-66t-66-158v-960q0-92 66-158t158-66h320q92 0 158 66t66 158v32h672q92 0 158 66t66 158z"
62+
63+
64+package : Html msg
65+package =
66+ icon "#babdb6" "16px" "M1088 832q0-26-19-45t-45-19h-256q-26 0-45 19t-19 45 19 45 45 19h256q26 0 45-19t19-45zm576-192v960q0 26-19 45t-45 19h-1408q-26 0-45-19t-19-45v-960q0-26 19-45t45-19h1408q26 0 45 19t19 45zm64-448v256q0 26-19 45t-45 19h-1536q-26 0-45-19t-19-45v-256q0-26 19-45t45-19h1536q26 0 45 19t19 45z"
67+
68+
69+plus : Html msg
70+plus =
71+ icon "#babdb6" "16px" "M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"
72+
73+
74+
75+-- LOOKUP
76+
77+
78+lookup : String -> Html msg
79+lookup fileName =
80+ let
81+ extension =
82+ getExtension fileName
83+ in
84+ Maybe.withDefault file (Dict.get extension extensionIcons)
85+
86+
87+extensionIcons : Dict.Dict String (Html msg)
88+extensionIcons =
89+ Dict.fromList
90+ [ ("jpg" , image)
91+ , ("jpeg", image)
92+ , ("png" , image)
93+ , ("gif" , image)
94+ ]
95+
96+
97+getExtension : String -> String
98+getExtension str =
99+ getExtensionHelp (String.split "." str)
100+
101+
102+getExtensionHelp : List String -> String
103+getExtensionHelp segments =
104+ case segments of
105+ [] ->
106+ ""
107+
108+ [ext] ->
109+ String.toLower ext
110+
111+ _ :: rest ->
112+ getExtensionHelp rest
browser/src/Index/Navigator.elmnew file+78
@@ -0,0 +1,78 @@
1+module Index.Navigator exposing (view, (</>))
2+
3+
4+import Color
5+import Html exposing (..)
6+import Html.Attributes exposing (..)
7+
8+import TempFontAwesome as FA
9+
10+
11+
12+-- ADD SLASHES
13+
14+
15+(</>) : String -> String -> String
16+(</>) directory file =
17+ if String.endsWith "/" directory then
18+ directory ++ file
19+
20+ else
21+ directory ++ "/" ++ file
22+
23+
24+
25+-- VIEW
26+
27+
28+view : String -> List String -> Html msg
29+view root dirs =
30+ div
31+ [ style "font-size" "2em"
32+ , style "padding" "20px 0"
33+ , style "display" "flex"
34+ , style "align-items" "center"
35+ , style "height" "40px"
36+ ]
37+ (makeLinks root dirs "/" [])
38+
39+
40+makeLinks : String -> List String -> String -> List (Html msg) -> List (Html msg)
41+makeLinks root dirs oldPath revAnchors =
42+ case dirs of
43+ dir :: otherDirs ->
44+ let
45+ newPath =
46+ oldPath </> dir
47+
48+ anchor =
49+ a [ href newPath ] [ text dir ]
50+ in
51+ makeLinks root otherDirs newPath (anchor :: revAnchors)
52+
53+ [] ->
54+ let
55+ home =
56+ a [ href "/"
57+ , title root
58+ , style "display" "inherit"
59+ ]
60+ [ FA.home Color.darkGrey 36
61+ ]
62+ in
63+ case revAnchors of
64+ [] ->
65+ [home]
66+
67+ lastAnchor :: otherRevAnchors ->
68+ home :: slash :: List.foldl addSlash [lastAnchor] otherRevAnchors
69+
70+
71+addSlash : Html msg -> List (Html msg) -> List (Html msg)
72+addSlash front back =
73+ front :: slash :: back
74+
75+
76+slash : Html msg
77+slash =
78+ span [ style "padding" "0 8px" ] [ text "/" ]
browser/src/Index/Skeleton.elmnew file+75
@@ -0,0 +1,75 @@
1+module Index.Skeleton exposing
2+ ( view
3+ , box
4+ , readmeBox
5+ )
6+
7+import Color exposing (Color, darkGrey)
8+import Html exposing (..)
9+import Html.Attributes exposing (..)
10+import Markdown
11+
12+import TempFontAwesome as FA
13+
14+
15+
16+-- VIEW
17+
18+
19+view : List (Html msg) -> Html msg
20+view content =
21+ div []
22+ [ header [ class "header" ] []
23+ , div [class "content"] content
24+ ]
25+
26+
27+
28+-- VIEW BOXES
29+
30+
31+type alias BoxArgs msg =
32+ { title : String
33+ , items : List (List (Html msg))
34+ , footer : Maybe (String, String)
35+ }
36+
37+
38+box : BoxArgs msg -> Html msg
39+box { title, items, footer } =
40+ let
41+ realItems =
42+ List.map (div [ class "box-item" ]) items
43+ in
44+ boxHelp title realItems footer
45+
46+
47+readmeBox : String -> Html msg
48+readmeBox markdown =
49+ let
50+ readme =
51+ Markdown.toHtml [ class "box-item" ] markdown
52+ in
53+ boxHelp "README" [readme] Nothing
54+
55+
56+boxHelp : String -> List (Html msg) -> Maybe (String, String) -> Html msg
57+boxHelp boxTitle items footer =
58+ div [ class "box" ] <|
59+ div [ class "box-header" ] [ text boxTitle ]
60+ :: items
61+ ++ [ boxFooter footer ]
62+
63+
64+boxFooter : Maybe (String, String) -> Html msg
65+boxFooter maybeFooter =
66+ case maybeFooter of
67+ Nothing ->
68+ text ""
69+
70+ Just (path, description) ->
71+ a [ href path
72+ , title description
73+ ]
74+ [ div [ class "box-footer" ] [ FA.plus darkGrey 14 ]
75+ ]
browser/src/Main.elmnew file+256
@@ -0,0 +1,256 @@
1+module Index.Dashboard exposing
2+ ( view
3+ )
4+
5+
6+import Html exposing (..)
7+import Html.Attributes exposing (class, href, style, title)
8+
9+import Elm.Config as Config exposing (Config)
10+import Elm.License as License
11+import Elm.Repo as Repo exposing (Repo)
12+import Elm.Version as Version exposing (Version)
13+import Index.Icon as Icon
14+import Index.Navigator as Navigator exposing ((</>))
15+import Index.Project as Project exposing (Project, File(..))
16+import Index.Skeleton as Skeleton
17+
18+
19+
20+-- MODEL
21+
22+
23+type alias Model =
24+ { path : String
25+ , status : ProjectStatus
26+ , directory : Status Directory
27+ }
28+
29+
30+type ProjectStatus
31+ = ProjectIsNew
32+ | ProjectIsInvalid
33+ | ProjectIsValid
34+ { root : String
35+ , project : Project.Project
36+ , exactDeps : List (Package.Name, Version.Version)
37+ }
38+
39+
40+type DirectoryStatus
41+ = NotFound
42+ | Waiting
43+ | Found Directory
44+
45+
46+
47+-- DIRECTORY
48+
49+
50+type alias Directory =
51+ { dirs : List String
52+ , files : List File
53+ , readme : Maybe String
54+ }
55+
56+
57+type alias File =
58+ { name : String
59+ , runnable : Bool
60+ }
61+
62+
63+
64+-- DECODER
65+
66+
67+decoder : D.Decoder Directory
68+decoder =
69+ D.map4 Directory
70+ (D.field "path" (D.list D.string))
71+ (D.field "dirs" (D.list D.string))
72+ (D.field "files" (D.list fileDecoder))
73+ (D.field "readme" (D.nullable D.string))
74+
75+
76+fileDecoder : D.Decoder File
77+fileDecoder =
78+ D.map2 File
79+ (D.field "name" D.string)
80+ (D.field "runnable" D.bool)
81+
82+
83+
84+-- NOT FOUND
85+
86+
87+notFound : Html msg
88+notFound =
89+ div [ class "not-found" ]
90+ [ div [ style "font-size" "12em" ] [ text "404" ]
91+ , div [ style "font-size" "3em" ] [ text "Page not found" ]
92+ ]
93+
94+
95+
96+-- WAITING
97+
98+
99+waiting : Html msg
100+waiting =
101+ div [ class "waiting" ]
102+ [ img [ src "/_elm/waiting.gif" ] []
103+ ]
104+
105+
106+
107+-- VIEW DIRECTORY
108+
109+
110+viewDirectory : Project -> Directory -> Html msg
111+viewDirectory project directory =
112+ Skeleton.view
113+ [ Navigator.view pwd
114+ , section [ class "left-column" ]
115+ [ viewFiles directory.dirs directory.files
116+ , viewReadme directory.readme
117+ ]
118+ , section [ class "right-column" ]
119+ [ viewProjectSummary project
120+ , viewDeps project
121+ , viewTestDeps project
122+ ]
123+ , div [ style "clear" "both" ] []
124+ ]
125+
126+
127+
128+-- VIEW README
129+
130+
131+viewReadme : Maybe String -> Html msg
132+viewReadme readme =
133+ case readme of
134+ Nothing ->
135+ text ""
136+
137+ Just markdown ->
138+ Skeleton.readmeBox markdown
139+
140+
141+
142+-- VIEW FILES
143+
144+
145+viewFiles : List String -> List File -> Html msg
146+viewFiles dirs files =
147+ Skeleton.box
148+ { title = "File Navigation"
149+ , items = List.map viewDir dirs ++ List.map viewFile files
150+ , footer = Nothing
151+ }
152+
153+
154+viewDir : String -> List (Html msg)
155+viewDir dir =
156+ [ a [ href dir ] [ Icon.folder, text dir ]
157+ ]
158+
159+
160+viewFile : File -> List (Html msg)
161+viewFile {name} =
162+ [ a [ href name ] [ Icon.lookup name, text name ]
163+ ]
164+
165+
166+
167+-- VIEW PAGE SUMMARY
168+
169+
170+viewProjectSummary : Project.Project -> Html msg
171+viewProjectSummary project =
172+ case project of
173+ Project.Browser info ->
174+ Skeleton.box
175+ { title = "Source Directories"
176+ , items = List.map (\dir -> [text dir]) info.dirs
177+ , footer = Nothing
178+ }
179+ -- TODO show estimated bundle size here
180+
181+ Project.Package info ->
182+ Skeleton.box
183+ { title = "Package Info"
184+ , items =
185+ [ [ text ("Name: " ++ info.name) ]
186+ , [ text ("Version: " ++ Version.toString info.version) ]
187+ , [ text ("License: " ++ License.toString info.license) ]
188+ ]
189+ , footer = Nothing
190+ }
191+
192+
193+
194+-- VIEW DEPENDENCIES
195+
196+
197+viewDeps : ExactDeps -> Project.Project -> Html msg
198+viewDeps exactDeps project =
199+ let
200+ dependencies =
201+ case project of
202+ Project.Browser info ->
203+ List.map (viewDependency exactDeps) info.deps
204+
205+ Project.Package info ->
206+ List.map (viewDependency exactDeps) info.deps
207+ in
208+ Skeleton.box
209+ { title = "Dependencies"
210+ , items = dependencies
211+ , footer = Nothing -- TODO Just ("/_elm/dependencies", "Add more dependencies?")
212+ }
213+
214+
215+viewTestDeps : ExactDeps -> Project.Project -> Html msg
216+viewTestDeps exactDeps project =
217+ let
218+ dependencies =
219+ case project of
220+ Project.Browser info ->
221+ List.map (viewDependency exactDeps) info.testDeps
222+
223+ Project.Package info ->
224+ List.map (viewDependency exactDeps) info.testDeps
225+ in
226+ Skeleton.box
227+ { title = "Test Dependencies"
228+ , items = dependencies
229+ , footer = Nothing -- TODO Just ("/_elm/test-dependencies", "Add more test dependencies?")
230+ }
231+
232+
233+viewDependency : ExactDeps -> (Package.Name, vsn) -> List (Html msg)
234+viewDependency exactDeps (pkg, _) =
235+ case Dict.get (Package.toString pkg) exactDeps of
236+ Nothing ->
237+ [ div [ style "float" "left" ]
238+ [ Icon.package
239+ , text (Package.toString pkg)
240+ ]
241+ , div [ style "float" "right" ] [ text "???" ]
242+ ]
243+
244+ Just version ->
245+ [ div [ style "float" "left" ]
246+ [ Icon.package
247+ , a [ href (toPackageUrl pkg version) ] [ text (Package.toString pkg) ]
248+ ]
249+ , div [ style "float" "right" ] [ text (Version.toString version) ]
250+ ]
251+
252+
253+toPackageUrl : Package.Name -> Version.Version -> String
254+toPackageUrl name version =
255+ "http://package.elm-lang.org/packages/"
256+ ++ Package.toString name ++ "/" ++ Version.toString version
browser/src/NotFound.elmnew file

No changes to the content.

browser/src/Page/Directory.elmnew file+202
@@ -0,0 +1,202 @@
1+module Page.Directory exposing
2+ ( Info
3+ , File(..)
4+ , decoder
5+ )
6+
7+
8+import Json.Decode as D
9+
10+import Elm.Project as Project
11+
12+
13+
14+
15+-- DIRECTORY
16+
17+
18+type alias Directory =
19+ { path : List String
20+ , dirs : List String
21+ , files : List File
22+ , readme : Maybe String
23+ }
24+
25+
26+type alias File =
27+ { name : String
28+ , runnable : Bool
29+ }
30+
31+
32+
33+-- DECODER
34+
35+
36+decoder : D.Decoder Directory
37+decoder =
38+ D.map4 Directory
39+ (D.field "path" (D.list D.string))
40+ (D.field "dirs" (D.list D.string))
41+ (D.field "files" (D.list fileDecoder))
42+ (D.field "readme" (D.nullable D.string))
43+
44+
45+fileDecoder : D.Decoder File
46+fileDecoder =
47+ D.map2 File
48+ (D.field "name" D.string)
49+ (D.field "runnable" D.bool)
50+
51+
52+
53+-- VIEW
54+
55+
56+view : Project -> Directory -> Html msg
57+view project directory =
58+ Skeleton.view
59+ [ Navigator.view pwd
60+ , section [ class "left-column" ]
61+ [ viewFiles directory.dirs directory.files
62+ , viewReadme directory.readme
63+ ]
64+ , section [ class "right-column" ]
65+ [ viewProjectSummary project
66+ , viewDeps project
67+ , viewTestDeps project
68+ ]
69+ , div [ style "clear" "both" ] []
70+ ]
71+
72+
73+
74+-- VIEW README
75+
76+
77+viewReadme : Maybe String -> Html msg
78+viewReadme readme =
79+ case readme of
80+ Nothing ->
81+ text ""
82+
83+ Just markdown ->
84+ Skeleton.readmeBox markdown
85+
86+
87+
88+-- VIEW FILES
89+
90+
91+viewFiles : List String -> List File -> Html msg
92+viewFiles dirs files =
93+ Skeleton.box
94+ { title = "File Navigation"
95+ , items = List.map viewDir dirs ++ List.map viewFile files
96+ , footer = Nothing
97+ }
98+
99+
100+viewDir : String -> List (Html msg)
101+viewDir dir =
102+ [ a [ href dir ] [ Icon.folder, text dir ]
103+ ]
104+
105+
106+viewFile : File -> List (Html msg)
107+viewFile {name} =
108+ [ a [ href name ] [ Icon.lookup name, text name ]
109+ ]
110+
111+
112+
113+-- VIEW PAGE SUMMARY
114+
115+
116+viewProjectSummary : Project.Project -> Html msg
117+viewProjectSummary project =
118+ case project of
119+ Project.Browser info ->
120+ Skeleton.box
121+ { title = "Source Directories"
122+ , items = List.map (\dir -> [text dir]) info.dirs
123+ , footer = Nothing
124+ }
125+ -- TODO show estimated bundle size here
126+
127+ Project.Package info ->
128+ Skeleton.box
129+ { title = "Package Info"
130+ , items =
131+ [ [ text ("Name: " ++ info.name) ]
132+ , [ text ("Version: " ++ Version.toString info.version) ]
133+ , [ text ("License: " ++ License.toString info.license) ]
134+ ]
135+ , footer = Nothing
136+ }
137+
138+
139+
140+-- VIEW DEPENDENCIES
141+
142+
143+viewDeps : ExactDeps -> Project.Project -> Html msg
144+viewDeps exactDeps project =
145+ let
146+ dependencies =
147+ case project of
148+ Project.Browser info ->
149+ List.map (viewDependency exactDeps) info.deps
150+
151+ Project.Package info ->
152+ List.map (viewDependency exactDeps) info.deps
153+ in
154+ Skeleton.box
155+ { title = "Dependencies"
156+ , items = dependencies
157+ , footer = Nothing -- TODO Just ("/_elm/dependencies", "Add more dependencies?")
158+ }
159+
160+
161+viewTestDeps : ExactDeps -> Project.Project -> Html msg
162+viewTestDeps exactDeps project =
163+ let
164+ dependencies =
165+ case project of
166+ Project.Browser info ->
167+ List.map (viewDependency exactDeps) info.testDeps
168+
169+ Project.Package info ->
170+ List.map (viewDependency exactDeps) info.testDeps
171+ in
172+ Skeleton.box
173+ { title = "Test Dependencies"
174+ , items = dependencies
175+ , footer = Nothing -- TODO Just ("/_elm/test-dependencies", "Add more test dependencies?")
176+ }
177+
178+
179+viewDependency : ExactDeps -> (Package.Name, vsn) -> List (Html msg)
180+viewDependency exactDeps (pkg, _) =
181+ case Dict.get (Package.toString pkg) exactDeps of
182+ Nothing ->
183+ [ div [ style "float" "left" ]
184+ [ Icon.package
185+ , text (Package.toString pkg)
186+ ]
187+ , div [ style "float" "right" ] [ text "???" ]
188+ ]
189+
190+ Just version ->
191+ [ div [ style "float" "left" ]
192+ [ Icon.package
193+ , a [ href (toPackageUrl pkg version) ] [ text (Package.toString pkg) ]
194+ ]
195+ , div [ style "float" "right" ] [ text (Version.toString version) ]
196+ ]
197+
198+
199+toPackageUrl : Package.Name -> Version.Version -> String
200+toPackageUrl name version =
201+ "http://package.elm-lang.org/packages/"
202+ ++ Package.toString name ++ "/" ++ Version.toString version
browser/src/Start.elmnew file+203
@@ -0,0 +1,203 @@
1+module Start exposing (..)
2+
3+
4+import Html exposing (..)
5+import Html.Attributes exposing (..)
6+import Html.Events exposing (..)
7+import Html.Lazy exposing (lazy)
8+import Http
9+import Navigation
10+import String
11+
12+
13+main =
14+ Html.programWithFlags
15+ { init = init
16+ , update = update
17+ , view = view
18+ , subscriptions = subscriptions
19+ }
20+
21+
22+
23+-- MODEL
24+
25+
26+type Model
27+ = NoProject String
28+ | PotentialProject String String
29+ | Waiting
30+
31+
32+
33+-- INIT
34+
35+
36+type alias Flags =
37+ { root : String
38+ , suggestion : Maybe String
39+ }
40+
41+
42+init : Flags -> ( Model, Cmd Msg )
43+init flags =
44+ case flags.suggestion of
45+ Nothing ->
46+ ( NoProject flags.root, Cmd.none )
47+
48+ Just suggestion ->
49+ ( PotentialProject flags.root suggestion, Cmd.none )
50+
51+
52+
53+-- UPDATE
54+
55+
56+type Msg
57+ = RequestNewProject
58+ | NewProjectReady
59+ | IgnoreSuggestion String
60+ | MoveReactor
61+
62+
63+update : Msg -> Model -> ( Model, Cmd Msg )
64+update msg model =
65+ case msg of
66+ RequestNewProject ->
67+ ( Waiting, createNewProject )
68+
69+ NewProjectReady ->
70+ ( Waiting, Navigation.reload )
71+
72+ IgnoreSuggestion root ->
73+ ( NoProject root, Cmd.none )
74+
75+ MoveReactor ->
76+ ( Waiting, moveReactor )
77+
78+
79+createNewProject : Cmd Msg
80+createNewProject =
81+ Http.send (\_ -> NewProjectReady) <|
82+ Http.getString "/_elm/create-new-project"
83+
84+
85+moveReactor : Cmd Msg
86+moveReactor =
87+ Http.send (\_ -> NewProjectReady) <|
88+ Http.getString "/_elm/move-to-root"
89+
90+
91+
92+-- SUBSCRIPTIONS
93+
94+
95+subscriptions : Model -> Sub Msg
96+subscriptions _ =
97+ Sub.none
98+
99+
100+
101+-- VIEW
102+
103+
104+view : Model -> Html Msg
105+view model =
106+ case model of
107+ NoProject root ->
108+ viewNoProject root
109+
110+ PotentialProject root suggestion ->
111+ viewPotentialProject root suggestion
112+
113+ Waiting ->
114+ viewWaiting
115+
116+
117+
118+-- VIEW NO PROJECT
119+
120+
121+viewNoProject : String -> Html Msg
122+viewNoProject root =
123+ div [ class "start" ]
124+ [ div [ class "start-hello" ]
125+ [ h1 [] [ text "Hello!" ]
126+ , para "Looks like you are starting a new Elm project. Exciting!"
127+ , para "I will help you get set up. Just press this button!"
128+ , div [ class "button" ]
129+ [ a [ onClick RequestNewProject ] [ text "Create New Project" ]
130+ ]
131+ ]
132+ , div [ class "start-details" ]
133+ [ h2 [] [ text "What does this button do exactly?" ]
134+ , p []
135+ [ text "In the "
136+ , code [] [ text root ]
137+ , text " directory, I will create:"
138+ ]
139+ , ul []
140+ [ file "elm.json" "describes which packages you need."
141+ , file "src/" "a directory for all your Elm code."
142+ , file "src/Main.elm" "an example Elm program."
143+ , file "tests/" "a directory for any tests you write."
144+ ]
145+ , para "I will share more details on all this after you press the button!"
146+ ]
147+ ]
148+
149+
150+para : String -> Html msg
151+para str =
152+ p [] [ text str ]
153+
154+
155+file : String -> String -> Html msg
156+file fileName description =
157+ li []
158+ [ code [] [ text fileName ]
159+ , text " – "
160+ , text description
161+ ]
162+
163+
164+
165+-- VIEW WAITING
166+
167+
168+viewWaiting : Html msg
169+viewWaiting =
170+ div [ class "waiting" ]
171+ [ img [ src "/_elm/waiting.gif" ] []
172+ ]
173+
174+
175+
176+-- VIEW POTENTIAL PROJECT
177+
178+
179+viewPotentialProject : String -> String -> Html Msg
180+viewPotentialProject root suggestion =
181+ div [ class "start potential" ]
182+ [ h1 [] [ text "Existing Project?" ]
183+ , p []
184+ [ text "You ran "
185+ , code [] [ text "elm-reactor" ]
186+ , text " from "
187+ , code [] [ text root ]
188+ , text " which is not the root of an Elm project."
189+ ]
190+ , p []
191+ [ text "I found an Elm project at "
192+ , code [] [ text suggestion ]
193+ , text " though. Would you like to continue developing that one?"
194+ ]
195+ , div [ class "button" ]
196+ [ a [ onClick MoveReactor ] [ text "Continue Existing Project" ]
197+ ]
198+ , h1 [] [ text "Or New Project?" ]
199+ , para "Or maybe you want some weird nested Elm project, where you have Elm projects within other Elm projects. It is probably better to have them separated, but I can get you set up if that is what you really want!"
200+ , div [ class "button" ]
201+ [ a [ onClick (IgnoreSuggestion root) ] [ text "New Project" ]
202+ ]
203+ ]
elm.cabalnew file+189
@@ -0,0 +1,189 @@
1+
2+Name: elm
3+Version: 0.19.0
4+
5+Synopsis:
6+ The `elm` command line interface.
7+
8+Description:
9+ This includes commands like `elm make`, `elm repl`, and many others
10+ for helping make Elm developers happy and productive.
11+
12+Homepage: http://elm-lang.org
13+
14+License: BSD3
15+License-file: LICENSE
16+
17+Author: Evan Czaplicki
18+Maintainer: info@elm-lang.org
19+Copyright: Copyright (c) 2011-present, Evan Czaplicki
20+
21+Category: Compiler, Language
22+
23+Cabal-version: >=1.9
24+Build-type: Simple
25+
26+source-repository head
27+ type: git
28+ location: git://github.com/elm-lang/elm-compiler.git
29+
30+
31+Flag dev {
32+ Description: Turn off optimization and make warnings errors
33+ Default: False
34+}
35+
36+
37+Executable elm
38+ if flag(dev)
39+ ghc-options: -O0 -Wall -Werror
40+ else
41+ ghc-options: -O2 -fsimpl-tick-factor=200
42+
43+ Hs-Source-Dirs:
44+ compiler/src
45+ builder/src
46+ cli/src
47+
48+ Main-Is:
49+ Main.hs
50+
51+ exposed-modules:
52+ Elm.Compiler,
53+ Elm.Compiler.Module,
54+ Elm.Compiler.Objects,
55+ Elm.Compiler.Type,
56+ Elm.Docs,
57+ Elm.Kernel,
58+ Elm.Header,
59+ Elm.Name,
60+ Elm.Package,
61+ Elm.Utils,
62+ Json.Decode,
63+ Json.Encode
64+
65+ other-modules:
66+ AST.Canonical,
67+ AST.Optimized,
68+ AST.Source,
69+ AST.Module.Name,
70+ AST.Utils.Binop,
71+ AST.Utils.Shader,
72+ AST.Utils.Type,
73+ AST.Valid,
74+ Canonicalize.Effects,
75+ Canonicalize.Environment,
76+ Canonicalize.Environment.Dups,
77+ Canonicalize.Environment.Foreign,
78+ Canonicalize.Environment.Local,
79+ Canonicalize.Expression,
80+ Canonicalize.Module,
81+ Canonicalize.Pattern,
82+ Canonicalize.Type,
83+ Compile,
84+ Data.Bag,
85+ Data.Index,
86+ Data.OneOrMore,
87+ Elm.Compiler.Imports,
88+ Elm.Compiler.Type.Extract,
89+ Elm.Compiler.Version,
90+ Elm.Interface,
91+ Generate.JavaScript,
92+ Generate.JavaScript.Builder,
93+ Generate.JavaScript.Expression,
94+ Generate.JavaScript.Name,
95+ Json.Decode.Internals,
96+ Nitpick.PatternMatches,
97+ Optimize.Case,
98+ Optimize.DecisionTree,
99+ Optimize.Expression,
100+ Optimize.Module,
101+ Optimize.Names,
102+ Optimize.Port,
103+ Parse.Declaration,
104+ Parse.Expression,
105+ Parse.Module,
106+ Parse.Parse,
107+ Parse.Pattern,
108+ Parse.Primitives,
109+ Parse.Primitives.Internals,
110+ Parse.Primitives.Kernel,
111+ Parse.Primitives.Keyword,
112+ Parse.Primitives.Number,
113+ Parse.Primitives.Shader,
114+ Parse.Primitives.Symbol,
115+ Parse.Primitives.Utf8,
116+ Parse.Primitives.Variable,
117+ Parse.Primitives.Whitespace,
118+ Parse.Repl,
119+ Parse.Shader,
120+ Parse.Type,
121+ Reporting.Annotation,
122+ Reporting.Error,
123+ Reporting.Error.Canonicalize,
124+ Reporting.Error.Docs,
125+ Reporting.Error.Json,
126+ Reporting.Error.Main,
127+ Reporting.Error.Pattern,
128+ Reporting.Error.Syntax,
129+ Reporting.Error.Type,
130+ Reporting.Helpers,
131+ Reporting.Region,
132+ Reporting.Render.Code,
133+ Reporting.Render.Type,
134+ Reporting.Report,
135+ Reporting.Result,
136+ Reporting.Warning,
137+ Type.Constrain.Expression,
138+ Type.Constrain.Module,
139+ Type.Constrain.Pattern,
140+ Type.Error,
141+ Type.Instantiate,
142+ Type.Occurs,
143+ Type.Solve,
144+ Type.Type,
145+ Type.Unify,
146+ Type.UnionFind,
147+ Validate,
148+ Paths_elm_compiler
149+
150+ Build-depends:
151+ ansi-terminal >= 0.7 && < 0.8,
152+ ansi-wl-pprint >= 0.6.7 && < 0.7,
153+ base >=4.8 && <5,
154+ binary >= 0.8 && < 0.9,
155+ blaze-html,
156+ blaze-markup,
157+ bytestring >= 0.9 && < 0.11,
158+ containers >= 0.5.8.2 && < 0.6,
159+ directory >= 1.2.3.0 && < 2.0,
160+ edit-distance >= 0.2 && < 0.3,
161+ filepath >= 1 && < 2.0,
162+ ghc-prim,
163+ haskeline,
164+ HTTP >= 4000.2.5 && < 4000.4,
165+ http-client >= 0.5 && < 0.6,
166+ http-client-tls >= 0.3 && < 0.4,
167+ http-types >= 0.9 && < 1.0,
168+ language-glsl >= 0.0.2 && < 0.3,
169+ logict,
170+ mtl >= 2.2.1 && < 3,
171+ network >= 2.4 && < 2.7,
172+ parsec,
173+ pretty >= 1.0 && < 2.0,
174+ process,
175+ raw-strings-qq,
176+ scientific,
177+ semigroups,
178+ SHA,
179+ snap-core,
180+ snap-server,
181+ template-haskell,
182+ text >= 1 && < 2,
183+ time,
184+ unordered-containers,
185+ utf8-string,
186+ vector,
187+ websockets,
188+ websockets-snap,
189+ zip-archive
cli/elm.cabal → terminal/elm.cabalrenamed

The content is the same.

cli/src/Bump.hs → terminal/src/Bump.hsrenamed

The content is the same.

cli/src/CommandLine/Args.hs → terminal/src/CommandLine/Args.hsrenamed

The content is the same.

cli/src/CommandLine/Args/Internal.hs → terminal/src/CommandLine/Args/Internal.hsrenamed

The content is the same.

cli/src/Develop.hs → terminal/src/Develop.hsrenamed

The content is the same.

cli/src/Develop/Compile.hs → terminal/src/Develop/Compile.hsrenamed

The content is the same.

cli/src/Develop/Generate/Help.hs → terminal/src/Develop/Generate/Help.hsrenamed

The content is the same.

cli/src/Develop/Generate/Index.hs → terminal/src/Develop/Generate/Index.hsrenamed

The content is the same.

cli/src/Develop/Generate/NotFound.hs → terminal/src/Develop/Generate/NotFound.hsrenamed

The content is the same.

cli/src/Develop/Socket.hs → terminal/src/Develop/Socket.hsrenamed

The content is the same.

cli/src/Develop/StaticFiles.hs → terminal/src/Develop/StaticFiles.hsrenamed

The content is the same.

cli/src/Develop/StaticFiles/Build.hs → terminal/src/Develop/StaticFiles/Build.hsrenamed

The content is the same.

cli/src/Diff.hs → terminal/src/Diff.hsrenamed

The content is the same.

cli/src/Install.hs → terminal/src/Install.hsrenamed

The content is the same.

cli/src/Main.hs → terminal/src/Main.hsrenamed

The content is the same.

cli/src/Make.hs → terminal/src/Make.hsrenamed

The content is the same.

cli/src/Publish.hs → terminal/src/Publish.hsrenamed

The content is the same.

cli/src/Repl.hs → terminal/src/Repl.hsrenamed

The content is the same.