@@ -1,26 +1,36 @@
11{-# LANGUAGE OverloadedStrings #-}
22module Reporting.Exit
3− ( Init(..), initToReport
4− , Diff(..), diffToReport
5− , Make(..), makeToReport
6− , Bump(..), bumpToReport
7− , Repl(..), replToReport
8− , Publish(..), publishToReport
9− , Install(..), installToReport
10− , Reactor(..), reactorToReport
3+ ( Init(..)
4+ , initToReport
5+ --
6+ , Diff(..)
7+ , diffToReport
8+ --
9+ , Bump(..)
10+ , bumpToReport
1111 , newPackageOverview
1212 --
13+ , Publish(..)
14+ , publishToReport
15+ --
16+ , Install(..)
17+ , installToReport
18+ --
1319 , Solver(..)
20+ --
1421 , Outline(..)
1522 , OutlineProblem(..)
23+ --
1624 , Details(..)
17− , DetailsBadDep(..)
18− , PackageProblem(..)
1925 , RegistryProblem(..)
26+ , PackageProblem(..)
27+ --
28+ , Make(..)
2029 , BuildProblem(..)
2130 , BuildProjectProblem(..)
31+ , makeToReport
32+ --
2233 , DocsProblem(..)
23− , Generate(..)
2434 --
2535 , toString
2636 , toStderr
@@ -29,24 +39,14 @@ module Reporting.Exit
2939 where
3040
3141
32−import qualified Data.ByteString as BS
33−import qualified Data.ByteString.UTF8 as BS_UTF8
3442import qualified Data.List as List
35−import qualified Data.Map as Map
36−import qualified Data.Name as N
3743import qualified Data.NonEmptyList as NE
38−import qualified Network.HTTP.Client as HTTP
39−import qualified Network.HTTP.Types.Header as HTTP
40−import qualified Network.HTTP.Types.Status as HTTP
41−import qualified System.FilePath as FP
42−import System.FilePath ((</>), (<.>))
4344
4445import qualified Elm.Constraint as C
4546import qualified Elm.Magnitude as M
4647import qualified Elm.ModuleName as ModuleName
4748import qualified Elm.Package as Pkg
4849import qualified Elm.Version as V
49−import qualified File
5050import qualified Http
5151import qualified Json.Decode as Decode
5252import qualified Json.Encode as Encode
@@ -63,25 +63,6 @@ import qualified Reporting.Render.Code as Code
6363
6464
6565
66−-- RENDERERS
67−
68−
69−toString :: Help.Report -> String
70−toString report =
71− Help.toString (Help.reportToDoc report)
72−
73−
74−toStderr :: Help.Report -> IO ()
75−toStderr report =
76− Help.toStderr (Help.reportToDoc report)
77−
78−
79−toJson :: Help.Report -> Encode.Value
80−toJson report =
81− Help.reportToJson report
82−
83−
84−
8566-- INIT
8667
8768
@@ -109,18 +90,13 @@ initToReport exit =
10990
11091 InitNoOfflineSolution pkgs ->
11192 Help.report "NO OFFLINE SOLUTION" Nothing
112− "I tried to create an elm.json with the following direct dependencies:"
113− [ D.indent 4 $ D.vcat $
114− map (D.dullyellow . D.fromChars . Pkg.toChars) pkgs
115− , D.reflow $
116− "I could not find compatible versions though, but that may be because I could not\
117− \ connect to https://package.elm-lang.org to get the latest list of packages. Are\
118− \ you able to connect to the internet? Please ask around one of the community\
119− \ forums at https://elm-lang.org/community for help!"
120− ]
93+ (error "TODO InitNoOfflineSolution" pkgs)
94+ (error "TODO InitNoOfflineSolution" pkgs)
95+ -- note about Russia IP addresses?
96+ -- ask if they are on a plane or train
12197
12298 InitSolverProblem solver ->
123− toSolverReport solver
99+ error "TODO InitSolverProblem" solver
124100
125101 InitAlreadyExists ->
126102 Help.report "EXISTING PROJECT" Nothing
@@ -131,9 +107,8 @@ initToReport exit =
131107 ]
132108 ]
133109
134− InitRegistryProblem problem ->
135− toRegistryProblemReport "PROBLEM LOADING PACKAGE LIST" problem $
136− "I need the list of published packages before I can start initializing projects"
110+ InitRegistryProblem _ ->
111+ error "TODO InitRegistryProblem"
137112
138113
139114
@@ -148,8 +123,8 @@ data Diff
148123 | DiffUnpublished
149124 | DiffUnknownPackage Pkg.Name [Pkg.Name]
150125 | DiffUnknownVersion Pkg.Name V.Version [V.Version]
151− | DiffDocsProblem V.Version DocsProblem
152− | DiffMustHaveLatestRegistry RegistryProblem
126+ | DiffDocsProblem DocsProblem
127+ | DiffBadRegistry RegistryProblem
153128 | DiffBadDetails Details
154129 | DiffBadBuild BuildProblem
155130
@@ -162,28 +137,23 @@ diffToReport diff =
162137 "I cannot find an elm.json so I am not sure what you want me to diff.\
163138 \ Normally you run `elm diff` from within a project!"
164139 [ D.reflow $ "If you are just curious to see a diff, try running this command:"
165− , D.indent 4 $ D.green $ "elm diff elm/http 1.0.0 2.0.0"
140+ , D.indent 4 $ D.green $ "elm diff elm/html 5.1.1 6.0.0"
166141 ]
167142
168143 DiffBadOutline outline ->
169144 toOutlineReport outline
170145
171146 DiffApplication ->
172− Help.report "CANNOT DIFF APPLICATIONS" (Just "elm.json")
173− "Your elm.json says this project is an application, but `elm diff` only works\
174− \ with packages. That way there are previously published versions of the API to\
175− \ diff against!"
147+ Help.report "CANNOT DIFF APPLICATIONS" Nothing
148+ "It looks like you are running `elm diff` on an application, but it\
149+ \ only makes sense for packages that have been published. That way\
150+ \ there is a fixed API to diff against."
176151 [ D.reflow $ "If you are just curious to see a diff, try running this command:"
177− , D.indent 4 $ D.dullyellow $ "elm diff elm/json 1.0.0 1.1.2"
152+ , D.indent 4 $ D.green $ "elm diff elm/html 5.1.1 6.0.0"
178153 ]
179154
180155 DiffNoExposed ->
181− Help.report "NO EXPOSED MODULES" (Just "elm.json")
182− "Your elm.json has no \"exposed-modules\" which means there is no public API at\
183− \ all right now! What am I supposed to diff?"
184− [ D.reflow $
185− "Try adding some modules back to the \"exposed-modules\" field."
186− ]
156+ error "TODO DiffNoExposed"
187157
188158 DiffUnpublished ->
189159 Help.report "UNPUBLISHED" Nothing
@@ -218,19 +188,17 @@ diffToReport diff =
218188 , "Want one of those instead?"
219189 ]
220190
221− DiffDocsProblem version problem ->
222− toDocsProblemReport problem $
223− "I need the docs for " ++ V.toChars version ++ " to compute this diff"
191+ DiffDocsProblem problem ->
192+ error "TODO DiffDocsProblem" problem
224193
225− DiffMustHaveLatestRegistry problem ->
226− toRegistryProblemReport "PROBLEM UPDATING PACKAGE LIST" problem $
227− "I need the latest list of published packages before I do this diff"
194+ DiffBadRegistry problem ->
195+ error "TODO DiffBadRegistry" problem
228196
229197 DiffBadDetails details ->
230− toDetailsReport details
198+ error "TODO DiffBadDetails" details
231199
232200 DiffBadBuild buildProblem ->
233− toBuildProblemReport buildProblem
201+ error "TODO DiffBadBuild" buildProblem
234202
235203
236204
@@ -244,22 +212,13 @@ data Bump
244212 | BumpUnexpectedVersion V.Version [V.Version]
245213 | BumpMustHaveLatestRegistry RegistryProblem
246214 | BumpCannotFindDocs Pkg.Name V.Version DocsProblem
247− | BumpBadDetails Details
248− | BumpNoExposed
249− | BumpBadBuild BuildProblem
250215
251216
252217bumpToReport :: Bump -> Help.Report
253218bumpToReport bump =
254219 case bump of
255220 BumpNoOutline ->
256− Help.report "BUMP WHAT?" Nothing
257− "I cannot find an elm.json so I am not sure what you want me to bump."
258− [ D.reflow $
259− "Elm packages always have an elm.json that says current the version number. If\
260− \ you run this command from a directory with an elm.json file, I will try to bump\
261− \ the version in there based on the API changes."
262− ]
221+ error "TODO BumpNoOutline"
263222
264223 BumpBadOutline outline ->
265224 toOutlineReport outline
@@ -287,30 +246,10 @@ bumpToReport bump =
287246 ]
288247
289248 BumpMustHaveLatestRegistry problem ->
290− toRegistryProblemReport "PROBLEM UPDATING PACKAGE LIST" problem $
291− "I need the latest list of published packages before I can bump any versions"
292−
293− BumpCannotFindDocs _ version problem ->
294− toDocsProblemReport problem $
295− "I need the docs for " ++ V.toChars version ++ " to compute the next version number"
296−
297− BumpBadDetails details ->
298− toDetailsReport details
299−
300− BumpNoExposed ->
301− Help.docReport "NO EXPOSED MODULES" (Just "elm.json")
302− ( D.fillSep $
303− [ "To", "bump", "a", "package,", "the"
304− , D.dullyellow "\"exposed-modules\"", "field", "of", "your"
305− , "elm.json", "must", "list", "at", "least", "one", "module."
306− ]
307− )
308− [ D.reflow $
309− "Try adding some modules back to the \"exposed-modules\" field."
310− ]
249+ error "TODO BumpMustHaveLatestRegistry" problem
311250
312− BumpBadBuild problem ->
313− toBuildProblemReport problem
251+ BumpCannotFindDocs name version problem ->
252+ error "TODO BumpCannotFindDocs" name version problem
314253
315254
316255
@@ -357,13 +296,12 @@ data Publish
357296 | PublishShortReadme
358297 | PublishNoLicense
359298 | PublishBuildProblem BuildProblem
360− | PublishMissingTag V.Version
361− | PublishCannotGetTag V.Version Http.Error
362− | PublishCannotGetTagData V.Version String BS.ByteString
299+ | PublishCannotGetTag Http.Error
363300 | PublishCannotGetZip Http.Error
364− | PublishCannotDecodeZip String
365− | PublishCannotGetDocs V.Version V.Version DocsProblem
301+ | PublishCannotDecodeZip
302+ | PublishCannotGetDocs DocsProblem
366303 | PublishCannotRegister Http.Error
304+ | PublishMissingTag V.Version
367305 | PublishNoGit
368306 | PublishLocalChanges V.Version
369307 --
@@ -377,22 +315,16 @@ publishToReport :: Publish -> Help.Report
377315publishToReport publish =
378316 case publish of
379317 PublishNoOutline ->
380− Help.report "PUBLISH WHAT?" Nothing
381− "I cannot find an elm.json so I am not sure what you want me to publish."
382− [ D.reflow $
383− "Elm packages always have an elm.json that states the version number,\
384− \ dependencies, exposed modules, etc."
385− ]
318+ error "TODO PublishNoOutline"
386319
387320 PublishBadOutline outline ->
388321 toOutlineReport outline
389322
390323 PublishBadDetails problem ->
391− toDetailsReport problem
324+ error "TODO PublishBadDetails" problem
392325
393326 PublishMustHaveLatestRegistry problem ->
394− toRegistryProblemReport "PROBLEM UPDATING PACKAGE LIST" problem $
395− "I need the latest list of published packages to make sure this is safe to publish"
327+ error "TODO PublishMustHaveLatestRegistry" problem
396328
397329 PublishApplication ->
398330 Help.report "UNPUBLISHABLE" Nothing "I cannot publish applications, only packages!" []
@@ -497,8 +429,7 @@ publishToReport publish =
497429 ]
498430 )
499431 [ D.reflow $
500− "Which modules do you want users of the package to have access to? Add their\
501− \ names to the \"exposed-modules\" list."
432+ "What is the point of a package that has no modules?!"
502433 ]
503434
504435 PublishNoReadme ->
@@ -525,7 +456,22 @@ publishToReport publish =
525456 ]
526457
527458 PublishBuildProblem buildProblem ->
528− toBuildProblemReport buildProblem
459+ error "TODO PublishBuildProblem" buildProblem
460+
461+ PublishCannotGetTag httpError ->
462+ error "TODO PublishCannotGetTag" httpError
463+
464+ PublishCannotGetZip httpError ->
465+ error "TODO PublishCannotGetZip" httpError
466+
467+ PublishCannotDecodeZip ->
468+ error "TODO PublishCannotDecodeZip"
469+
470+ PublishCannotGetDocs docsProblem ->
471+ error "TODO PublishCannotGetDocs" docsProblem
472+
473+ PublishCannotRegister httpError ->
474+ error "TODO PublishCannotRegister" httpError
529475
530476 PublishMissingTag version ->
531477 let vsn = V.toChars version in
@@ -546,70 +492,6 @@ publishToReport publish =
546492 , "The -m flag is for a helpful message. Try to make it more informative!"
547493 ]
548494
549− PublishCannotGetTag version httpError ->
550− case httpError of
551− Http.BadHttp _ (HTTP.StatusCodeException response _)
552− | HTTP.statusCode (HTTP.responseStatus response) == 404 ->
553− let vsn = V.toChars version in
554− Help.report "NO TAG ON GITHUB" Nothing
555− ("You have version " ++ vsn ++ " tagged locally, but not on GitHub.")
556− [ D.reflow
557− "Run the following command to make this tag available on GitHub:"
558− , D.indent 4 $ D.dullyellow $ D.fromChars $
559− "git push origin " ++ vsn
560− , D.reflow
561− "This will make it possible to find your code online based on the version number."
562− ]
563−
564− _ ->
565− toHttpErrorReport "PROBLEM VERIFYING TAG" httpError
566− "I need to check that the version tag is registered on GitHub"
567−
568− PublishCannotGetTagData version url body ->
569− Help.report "PROBLEM VERIFYING TAG" Nothing
570− ("I need to check that version " ++ V.toChars version ++ " is tagged on GitHub, so I fetched:")
571− [ D.indent 4 $ D.dullyellow $ D.fromChars url
572− , D.reflow $
573− "I got the data back, but it was not what I was expecting. The response\
574− \ body contains " ++ show (BS.length body) ++ " bytes. Here is the "
575− ++ if BS.length body <= 76 then "whole thing:" else "beginning:"
576− , D.indent 4 $ D.dullyellow $ D.fromChars $
577− if BS.length body <= 76
578− then BS_UTF8.toString body
579− else take 73 (BS_UTF8.toString body) ++ "..."
580− , D.reflow $
581− "Does this error keep showing up? Maybe there is something weird with your\
582− \ internet connection. We have gotten reports that schools, businesses,\
583− \ airports, etc. sometimes intercept requests and add things to the body\
584− \ or change its contents entirely. Could that be the problem?"
585− ]
586−
587− PublishCannotGetZip httpError ->
588− toHttpErrorReport "PROBLEM DOWNLOADING CODE" httpError $
589− "I need to check that folks can download and build the source code when they\
590− \ install this package"
591−
592− PublishCannotDecodeZip url ->
593− Help.report "PROBLEM DOWNLOADING CODE" Nothing
594− "I need to check that folks can download and build the source code when they\
595− \ install this package, so I downloaded the code from:"
596− [ D.indent 4 $ D.dullyellow $ D.fromChars url
597− , D.reflow $
598− "I was unable to unzip the archive though. Maybe there is something weird with\
599− \ your internet connection. We have gotten reports that schools, businesses,\
600− \ airports, etc. sometimes intercept requests and add things to the body or\
601− \ change its contents entirely. Could that be the problem?"
602− ]
603−
604− PublishCannotGetDocs old new docsProblem ->
605− toDocsProblemReport docsProblem $
606− "I need the docs for " ++ V.toChars old ++ " to verify that "
607− ++ V.toChars new ++ " really does come next"
608−
609− PublishCannotRegister httpError ->
610− toHttpErrorReport "PROBLEM PUBLISHING PACKAGE" httpError $
611− "I need to send information about your package to the package website"
612−
613495 PublishNoGit ->
614496 Help.report "NO GIT" Nothing
615497 "I searched your PATH environment variable for `git` and could not\
@@ -639,17 +521,17 @@ publishToReport publish =
639521 ++ vsn ++ "` and publish your code from there."
640522 ]
641523
642− PublishZipBadDetails _ ->
643− badZipReport
524+ PublishZipBadDetails details ->
525+ error "TODO PublishZipBadDetails" details
644526
645527 PublishZipApplication ->
646− badZipReport
528+ error "TODO PublishZipApplication"
647529
648530 PublishZipNoExposed ->
649− badZipReport
531+ error "TODO PublishZipNoExposed"
650532
651− PublishZipBuildProblem _ ->
652− badZipReport
533+ PublishZipBuildProblem buildProblem ->
534+ error "TODO PublishZipBuildProblem" buildProblem
653535
654536
655537toBadReadmeReport :: String -> String -> Help.Report
@@ -666,24 +548,12 @@ toBadReadmeReport title summary =
666548 \ most common usage scenario. Show people what they can expect if\
667549 \ they learn more!"
668550 , D.toSimpleNote $
669− "By publishing your package, you are inviting people to invest time in\
670− \ understanding your work. Spending an hour on your README to communicate your\
671− \ knowledge more clearly can save the community days or weeks of time in\
672− \ aggregate, and saving time in aggregate is the whole point of publishing\
673− \ packages! People really appreciate it, and it makes the whole ecosystem feel\
674− \ nicer!"
675− ]
676−
677−
678−badZipReport :: Help.Report
679−badZipReport =
680− Help.report "PROBLEM VERIFYING PACKAGE" Nothing
681− "Before publishing packages, I download the code from GitHub and try to build it\
682− \ from scratch. That way I can be more confident that it will work for other\
683− \ people too. But I am not able to build it!"
684− [ D.reflow $
685− "I was just able to build your local copy though. Is there some way the version\
686− \ on GitHub could be different?"
551+ "By publishing your package, you are inviting people to invest time\
552+ \ in understanding your work. Spending an hour to communicate your\
553+ \ knowledge more clearly can save the community days or weeks of time\
554+ \ in aggregate, and saving time in aggregate is the whole point of\
555+ \ publishing packages! People really appreciate it, and it makes the\
556+ \ whole ecosystem feel nicer!"
687557 ]
688558
689559
@@ -693,80 +563,35 @@ badZipReport =
693563
694564data DocsProblem
695565 = DP_Http Http.Error
696− | DP_Data String BS.ByteString
566+ | DP_Data
697567 | DP_Cache
698568
699569
700−toDocsProblemReport :: DocsProblem -> String -> Help.Report
701−toDocsProblemReport problem context =
702− case problem of
703− DP_Http httpError ->
704− toHttpErrorReport "PROBLEM LOADING DOCS" httpError context
705−
706− DP_Data url body ->
707− Help.report "PROBLEM LOADING DOCS" Nothing (context ++ ", so I fetched:")
708− [ D.indent 4 $ D.dullyellow $ D.fromChars url
709− , D.reflow $
710− "I got the data back, but it was not what I was expecting. The response\
711− \ body contains " ++ show (BS.length body) ++ " bytes. Here is the "
712− ++ if BS.length body <= 76 then "whole thing:" else "beginning:"
713− , D.indent 4 $ D.dullyellow $ D.fromChars $
714− if BS.length body <= 76
715− then BS_UTF8.toString body
716− else take 73 (BS_UTF8.toString body) ++ "..."
717− , D.reflow $
718− "Does this error keep showing up? Maybe there is something weird with your\
719− \ internet connection. We have gotten reports that schools, businesses,\
720− \ airports, etc. sometimes intercept requests and add things to the body\
721− \ or change its contents entirely. Could that be the problem?"
722− ]
723−
724− DP_Cache ->
725− Help.report "PROBLEM LOADING DOCS" Nothing (context ++ ", but the local copy seems to be corrupted.")
726− [ D.reflow $
727− "I deleted the cached version, so the next run should download a fresh copy of\
728− \ the docs. Hopefully that will get you unstuck, but it will not resolve the root\
729− \ problem if, for example, a 3rd party editor plugin is modifing cached files\
730− \ for some reason."
731− ]
732−
733−
734570
735571-- INSTALL
736572
737573
738574data Install
739− = InstallNoOutline
740− | InstallBadOutline Outline
741− | InstallBadRegistry RegistryProblem
575+ = InstallNoProject
742576 | InstallNoArgs FilePath
743− | InstallNoOnlineAppSolution Pkg.Name
744− | InstallNoOfflineAppSolution Pkg.Name
745− | InstallNoOnlinePkgSolution Pkg.Name
746− | InstallNoOfflinePkgSolution Pkg.Name
577+ | InstallNoOnlineSolution
578+ | InstallNoOfflineSolution
747579 | InstallHadSolverTrouble Solver
748− | InstallUnknownPackageOnline Pkg.Name [Pkg.Name]
749− | InstallUnknownPackageOffline Pkg.Name [Pkg.Name]
750− | InstallBadDetails Details
580+ | InstallUnknownPackageOnline [Pkg.Name]
581+ | InstallUnknownPackageOffline [Pkg.Name]
582+ | InstallHasBadDetails Details
751583
752584
753585installToReport :: Install -> Help.Report
754586installToReport exit =
755587 case exit of
756− InstallNoOutline ->
588+ InstallNoProject ->
757589 Help.report "NEW PROJECT?" Nothing
758590 "Are you trying to start a new project? Try this command instead:"
759591 [ D.indent 4 $ D.green "elm init"
760592 , D.reflow "It will help you get started!"
761593 ]
762594
763− InstallBadOutline outline ->
764− toOutlineReport outline
765−
766− InstallBadRegistry problem ->
767− toRegistryProblemReport "PROBLEM LOADING PACKAGE LIST" problem $
768− "I need the list of published packages to figure out how to install things"
769−
770595 InstallNoArgs elmHome ->
771596 Help.report "INSTALL WHAT?" Nothing
772597 "I am expecting commands like:"
@@ -790,109 +615,50 @@ installToReport exit =
790615 ]
791616 ]
792617
793− InstallNoOnlineAppSolution pkg ->
794− Help.report "CANNOT FIND COMPATIBLE VERSION" (Just "elm.json")
795− (
796− "I cannot find a version of " ++ Pkg.toChars pkg ++ " that is compatible\
797− \ with your existing dependencies."
798− )
799− [ D.reflow $
800− "I checked all the published versions. When that failed, I tried to find any\
801− \ compatible combination of these packages, even if it meant changing all your\
802− \ existing dependencies! That did not work either!"
618+ InstallNoOnlineSolution ->
619+ Help.report "UNSOLVABLE DEPENDENCIES" (Just "elm.json") -- TODO recommend using solver in `elm reactor`
620+ "This usually happens if you try to modify dependency constraints by\
621+ \ hand. I recommend deleting any dependency you added recently (or all\
622+ \ of them if things are bad) and then adding them again with:"
623+ [ D.indent 4 $ D.green "elm install"
803624 , D.reflow $
804− "This is most likely to happen when a package is not upgraded yet. Maybe a new\
805− \ version of Elm came out recently? Maybe a common package was changed recently?\
806− \ Maybe a better package came along, so there was no need to upgrade this one?\
807− \ Try asking around https://elm-lang.org/community to learn what might be going on\
808− \ with this package."
809− , D.toSimpleNote $
810− "Whatever the case, please be kind to the relevant package authors! Having\
811− \ friendly interactions with users is great motivation, and conversely, getting\
812− \ berated by strangers on the internet sucks your soul dry. Furthermore, package\
813− \ authors are humans with families, friends, jobs, vacations, responsibilities,\
814− \ goals, etc. They face obstacles outside of their technical work you will never\
815− \ know about, so please assume the best and try to be patient and supportive!"
625+ "And do not be afaid to ask for help on Slack if you get stuck!"
816626 ]
817627
818− InstallNoOfflineAppSolution pkg ->
819− Help.report "CANNOT FIND COMPATIBLE VERSION LOCALLY" (Just "elm.json")
820− (
821− "I cannot find a version of " ++ Pkg.toChars pkg ++ " that is compatible\
822− \ with your existing dependencies."
823− )
824− [ D.reflow $
825− "I was not able to connect to https://package.elm-lang.org/ though, so I was only\
826− \ able to look through packages that you have downloaded in the past."
827− , D.reflow $
828− "Try again later when you have internet!"
829− ]
628+ InstallNoOfflineSolution ->
629+ error "TODO InstallNoOfflineSolution"
830630
831− InstallNoOnlinePkgSolution pkg ->
832− Help.report "CANNOT FIND COMPATIBLE VERSION" (Just "elm.json")
833− (
834− "I cannot find a version of " ++ Pkg.toChars pkg ++ " that is compatible\
835− \ with your existing constraints."
836− )
837− [ D.reflow $
838− "With applications, I try to broaden the constraints to see if anything works,\
839− \ but messing with package constraints is much more delicate business. E.g. making\
840− \ your constraints stricter may make it harder for applications to find compatible\
841− \ dependencies. So fixing something here may break it for a lot of other people!"
842− , D.reflow $
843− "So I recommend making an application with the same dependencies as your package.\
844− \ See if there is a solution at all. From there it may be easier to figure out\
845− \ how to proceed in a way that will disrupt your users as little as possible. And\
846− \ the solution may be to help other package authors to get their packages updated,\
847− \ or to drop a dependency entirely."
848− ]
631+ InstallHadSolverTrouble solver ->
632+ error "TODO InstallHadSolverTrouble" solver
849633
850− InstallNoOfflinePkgSolution pkg ->
851− Help.report "CANNOT FIND COMPATIBLE VERSION LOCALLY" (Just "elm.json")
852− (
853− "I cannot find a version of " ++ Pkg.toChars pkg ++ " that is compatible\
854− \ with your existing constraints."
855− )
856− [ D.reflow $
857− "I was not able to connect to https://package.elm-lang.org/ though, so I was only\
858− \ able to look through packages that you have downloaded in the past."
859− , D.reflow $
860− "Try again later when you have internet!"
861− ]
634+ InstallUnknownPackageOnline suggestions ->
635+ error "TODO InstallUnknownPackageOnline" suggestions
862636
863− InstallHadSolverTrouble solver ->
864− toSolverReport solver
637+ InstallUnknownPackageOffline suggestions ->
638+ error "TODO InstallUnknownPackageOffline" suggestions
865639
866− InstallUnknownPackageOnline pkg suggestions ->
867− Help.docReport "UNKNOWN PACKAGE" Nothing
868− (
869− D.fillSep
870− ["I","cannot","find","a","package","named",D.red (D.fromPackage pkg) <> "."]
871− )
872− [ D.reflow $
873− "I looked through https://package.elm-lang.org for packages with similar names\
874− \ and found these:"
875− , D.indent 4 $ D.dullyellow $ D.vcat $ map D.fromPackage suggestions
876− , D.reflow $ "Maybe you want one of these instead?"
877− ]
640+ InstallHasBadDetails _ ->
641+ error "TODO InstallHasBadDetails"
878642
879− InstallUnknownPackageOffline pkg suggestions ->
880− Help.docReport "UNKNOWN PACKAGE" Nothing
881− (
882− D.fillSep
883− ["I","cannot","find","a","package","named",D.red (D.fromPackage pkg) <> "."]
884− )
885− [ D.reflow $
886− "I could not connect to https://package.elm-lang.org though, so new packages may\
887− \ have been published since I last updated my local cache of package names."
888− , D.reflow $
889− "Looking through the locally cached names, the closest ones are:"
890− , D.indent 4 $ D.dullyellow $ D.vcat $ map D.fromPackage suggestions
891− , D.reflow $ "Maybe you want one of these instead?"
892− ]
893643
894− InstallBadDetails details ->
895− toDetailsReport details
644+{- TODO detect if library has no 0.19.0 version. Maybe do this on website though?
645+ Help.report "OLD DEPENDENCIES" (Just "elm.json")
646+ ( "The following packages do not work with Elm " ++ V.toChars V.compiler ++ " right now:"
647+ )
648+ [ D.indent 4 $ D.vcat $ map (D.red . D.fromPackage) badPackages
649+ , D.reflow $
650+ "This may be because it is not upgraded yet. It may be because a\
651+ \ better solution came along, so there was no need to upgrade it.\
652+ \ Etc. Try asking around on Slack to learn more about the topic."
653+ , D.toSimpleNote
654+ "Whatever the case, please be kind to the relevant package authors! Having\
655+ \ friendly interactions with users is great motivation, and conversely, getting\
656+ \ berated by strangers on the internet sucks your soul dry. Furthermore, package\
657+ \ authors are humans with families, friends, jobs, vacations, responsibilities,\
658+ \ goals, etc. They face obstacles outside of their technical work you will never\
659+ \ know about, so please assume the best and try to be patient and supportive!"
660+ ]
661+-}
896662
897663
898664
@@ -901,44 +667,8 @@ installToReport exit =
901667
902668data Solver
903669 = SolverBadCacheData Pkg.Name V.Version
904− | SolverBadHttpData Pkg.Name V.Version String
905− | SolverBadHttp Pkg.Name V.Version Http.Error
906−
907−
908−toSolverReport :: Solver -> Help.Report
909−toSolverReport problem =
910− case problem of
911− SolverBadCacheData pkg vsn ->
912− Help.report "PROBLEM SOLVING PACKAGE CONSTRAINTS" Nothing
913− (
914− "I need the elm.json of " ++ Pkg.toChars pkg ++ " " ++ V.toChars vsn ++ " to\
915− \ help me search for a set of compatible packages. I had it cached locally, but\
916− \ it looks like the file was corrupted!"
917− )
918− [ D.reflow $
919− "I deleted the cached version, so the next run should download a fresh copy.\
920− \ Hopefully that will get you unstuck, but it will not resolve the root\
921− \ problem if a 3rd party tool is modifing cached files for some reason."
922− ]
923−
924− SolverBadHttpData pkg vsn url ->
925− Help.report "PROBLEM SOLVING PACKAGE CONSTRAINTS" Nothing
926− (
927− "I need the elm.json of " ++ Pkg.toChars pkg ++ " " ++ V.toChars vsn ++ " to\
928− \ help me search for a set of compatible packages, but I ran into corrupted\
929− \ information from:"
930− )
931− [ D.indent 4 $ D.dullyellow $ D.fromChars url
932− , D.reflow $
933− "Is something weird with your internet connection. We have gotten reports that\
934− \ schools, businesses, airports, etc. sometimes intercept requests and add things\
935− \ to the body or change its contents entirely. Could that be the problem?"
936− ]
937−
938− SolverBadHttp pkg vsn httpError ->
939− toHttpErrorReport "PROBLEM SOLVING PACKAGE CONSTRAINTS" httpError $
940− "I need the elm.json of " ++ Pkg.toChars pkg ++ " " ++ V.toChars vsn
941− ++ " to help me search for a set of compatible packages"
670+ | SolverBadHttpData Pkg.Name V.Version
671+ | SolverBadHttp Http.Error
942672
943673
944674
@@ -947,8 +677,7 @@ toSolverReport problem =
947677
948678data Outline
949679 = OutlineHasBadStructure (Decode.Error OutlineProblem)
950− | OutlineHasMissingSrcDirs FilePath [FilePath]
951− | OutlineHasDuplicateSrcDirs FilePath FilePath FilePath
680+ | OutlineHasBadSrcDirs FilePath [FilePath]
952681 | OutlineNoPkgCore
953682 | OutlineNoAppCore
954683 | OutlineNoAppJson
@@ -967,344 +696,97 @@ data OutlineProblem
967696 | OP_NoSrcDirs
968697
969698
970−toOutlineReport :: Outline -> Help.Report
971−toOutlineReport problem =
972− case problem of
973− OutlineHasBadStructure decodeError ->
974− Json.toReport "elm.json" (Json.FailureToReport toOutlineProblemReport) decodeError $
975− Json.ExplicitReason "I ran into a problem with your elm.json file."
976−
977− OutlineHasMissingSrcDirs dir dirs ->
978− case dirs of
979− [] ->
980− Help.report "MISSING SOURCE DIRECTORY" (Just "elm.json")
981− "I need a valid elm.json file, but the \"source-directories\" field lists the following directory:"
982− [ D.indent 4 $ D.red $ D.fromChars dir
983− , D.reflow $
984− "I cannot find it though. Is it missing? Is there a typo?"
985− ]
986699
987− _:_ ->
988− Help.report "MISSING SOURCE DIRECTORIES" (Just "elm.json")
989− "I need a valid elm.json file, but the \"source-directories\" field lists the following directories:"
990− [ D.indent 4 $ D.vcat $
991− map (D.red . D.fromChars) (dir:dirs)
992− , D.reflow $
993− "I cannot find them though. Are they missing? Are there typos?"
994− ]
700+-- DETAILS
995701
996− OutlineHasDuplicateSrcDirs canonicalDir dir1 dir2 ->
997− if dir1 == dir2 then
998− Help.report "REDUNDANT SOURCE DIRECTORIES" (Just "elm.json")
999− "I need a valid elm.json file, but the \"source-directories\" field lists the same directory twice:"
1000− [ D.indent 4 $ D.vcat $
1001− map (D.red . D.fromChars) [dir1,dir2]
1002− , D.reflow $
1003− "Remove one of the entries!"
1004− ]
1005− else
1006− Help.report "REDUNDANT SOURCE DIRECTORIES" (Just "elm.json")
1007− "I need a valid elm.json file, but the \"source-directories\" field has some redundant directories:"
1008− [ D.indent 4 $ D.vcat $
1009− map (D.red . D.fromChars) [dir1,dir2]
1010− , D.reflow $
1011− "These are two different ways of refering to the same directory:"
1012− , D.indent 4 $ D.dullyellow $ D.fromChars canonicalDir
1013− , D.reflow $
1014− "Remove one of the redundant entries from your \"source-directories\" field."
1015− ]
1016702
1017− OutlineNoPkgCore ->
1018− Help.report "MISSING DEPENDENCY" (Just "elm.json")
1019− "I need to see an \"elm/core\" dependency your elm.json file. The default imports\
1020− \ of `List` and `Maybe` do not work without it."
1021− [ D.reflow $
1022− "If you modified your elm.json by hand, try to change it back! And if you are\
1023− \ having trouble getting back to a working elm.json, it may be easier to find a\
1024− \ working package and start fresh with their elm.json file."
1025− ]
703+data Details
704+ = DetailsCorrupt
705+ | DetailsNoSolution
706+ | DetailsNoOfflineSolution
707+ | DetailsSolverProblem Solver
708+ | DetailsBadElmInPkg C.Constraint
709+ | DetailsBadElmInAppOutline V.Version
710+ | DetailsHandEditedDependencies
711+ | DetailsBadOutline Outline
712+ | DetailsCannotGetRegistry RegistryProblem
713+ | DetailsCannotBuildPackage Pkg.Name V.Version PackageProblem
1026714
1027− OutlineNoAppCore ->
1028− Help.report "MISSING DEPENDENCY" (Just "elm.json")
1029− "I need to see an \"elm/core\" dependency your elm.json file. The default imports\
1030− \ of `List` and `Maybe` do not work without it."
1031− [ D.reflow $
1032− "If you modified your elm.json by hand, try to change it back! And if you are\
1033− \ having trouble getting back to a working elm.json, it may be easier to delete it\
1034− \ and use `elm init` to start fresh."
1035− ]
1036715
1037− OutlineNoAppJson ->
1038− Help.report "MISSING DEPENDENCY" (Just "elm.json")
1039− "I need to see an \"elm/json\" dependency your elm.json file. It helps me handle\
1040− \ flags and ports."
1041− [ D.reflow $
1042− "If you modified your elm.json by hand, try to change it back! And if you are\
1043− \ having trouble getting back to a working elm.json, it may be easier to delete it\
1044− \ and use `elm init` to start fresh."
1045− ]
716+data RegistryProblem
717+ = RP_Http Http.Error
718+ | RP_Data
1046719
1047720
1048−toOutlineProblemReport :: FilePath -> Code.Source -> Json.Context -> A.Region -> OutlineProblem -> Help.Report
1049−toOutlineProblemReport path source _ region problem =
1050− let
1051− toHighlight row col =
1052− Just $ A.Region (A.Position row col) (A.Position row col)
721+data PackageProblem
722+ = PP_BadEndpointRequest Http.Error
723+ | PP_BadEndpointContent
724+ | PP_BadArchiveRequest Http.Error
725+ | PP_BadArchiveContent
726+ | PP_BadArchiveHash String String
1053727
1054− toSnippet title highlight pair =
1055− Help.jsonReport title (Just path) $
1056− Code.toSnippet source region highlight pair
1057− in
1058− case problem of
1059− OP_BadType ->
1060− toSnippet "UNEXPECTED TYPE" Nothing
1061− ( D.reflow $
1062− "I got stuck while reading your elm.json file. I cannot handle a \"type\" like this:"
1063− , D.fillSep
1064− ["Try","changing","the","\"type\"","to"
1065− ,D.green "\"application\"","or",D.green "\"package\"","instead."
1066− ]
1067− )
1068728
1069− OP_BadPkgName row col ->
1070− toSnippet "INVALID PACKAGE NAME" (toHighlight row col)
1071− ( D.reflow $
1072− "I got stuck while reading your elm.json file. I ran into trouble with the package name:"
1073− , D.stack
1074− [ D.fillSep
1075− ["Package","names","are","always","written","as"
1076− ,D.green "\"author/project\""
1077− ,"so","I","am","expecting","to","see","something","like:"
1078− ]
1079− , D.dullyellow $ D.indent 4 $ D.vcat $
1080− [ "\"mdgriffith/elm-ui\""
1081− , "\"w0rm/elm-physics\""
1082− , "\"Microsoft/elm-json-tree-view\""
1083− , "\"FordLabs/elm-star-rating\""
1084− , "\"1602/json-schema\""
1085− ]
1086− , D.reflow
1087− "The author name should match your GitHub name exactly, and the project name\
1088− \ needs to follow these rules:"
1089− , D.indent 4 $ D.vcat $
1090− [ "+--------------------------------------+-----------+-----------+"
1091− , "| RULE | BAD | GOOD |"
1092− , "+--------------------------------------+-----------+-----------+"
1093− , "| only lower case, digits, and hyphens | elm-HTTP | elm-http |"
1094− , "| no leading digits | 3D | elm-3d |"
1095− , "| no non-ASCII characters | elm-bjørn | elm-bear |"
1096− , "| no underscores | elm_ui | elm-ui |"
1097− , "| no double hyphens | elm--hash | elm-hash |"
1098− , "| no starting or ending hyphen | -elm-tar- | elm-tar |"
1099− , "+--------------------------------------+-----------+-----------+"
1100− ]
1101− , D.toSimpleNote $
1102− "These rules only apply to the project name, so you should never need\
1103− \ to change your GitHub name!"
1104− ]
1105− )
1106729
1107− OP_BadVersion row col ->
1108− toSnippet "PROBLEM WITH VERSION" (toHighlight row col)
1109− ( D.reflow $
1110− "I got stuck while reading your elm.json file. I was expecting a version number here:"
1111− , D.fillSep
1112− ["I","need","something","like",D.green "\"1.0.0\"","or",D.green "\"2.0.4\""
1113− ,"that","explicitly","states","all","three","numbers!"
1114− ]
1115− )
730+-- MAKE
1116731
1117− OP_BadConstraint constraintError ->
1118− case constraintError of
1119− C.BadFormat row col ->
1120− toSnippet "PROBLEM WITH CONSTRAINT" (toHighlight row col)
1121− ( D.reflow $
1122− "I got stuck while reading your elm.json file. I do not understand this version constraint:"
1123− , D.stack
1124− [ D.fillSep
1125− ["I","need","something","like",D.green "\"1.0.0 <= v < 2.0.0\""
1126− ,"that","explicitly","lists","the","lower","and","upper","bounds."
1127− ]
1128− , D.toSimpleNote $
1129− "The spaces in there are required! Taking them out will confuse me. Adding\
1130− \ extra spaces confuses me too. I recommend starting with a valid example\
1131− \ and just changing the version numbers."
1132− ]
1133− )
1134732
1135− C.InvalidRange before after ->
1136− if before == after then
1137− toSnippet "PROBLEM WITH CONSTRAINT" Nothing
1138− ( D.reflow $
1139− "I got stuck while reading your elm.json file. I ran into an invalid version constraint:"
1140− , D.fillSep
1141− ["Elm","checks","that","all","package","APIs","follow","semantic","versioning,"
1142− ,"so","it","is","best","to","use","wide","constraints.","I","recommend"
1143− ,D.green $ "\"" <> D.fromVersion before <> " <= v < " <> D.fromVersion (V.bumpMajor after) <> "\""
1144− ,"since","it","is","guaranteed","that","breaking","API","changes","cannot"
1145− ,"happen","in","any","of","the","versions","in","that","range."
1146− ]
1147− )
733+data Make
734+ = MakeNeedsOutline
735+ | MakeCannotOptimizeAndDebug
736+ | MakeBlockedByDetailsProblem Details
737+ | MakeAppNeedsFileNames
738+ | MakePkgNeedsExposing
739+ | MakeMultipleFilesIntoHtml
740+ | MakeNonMainFilesIntoJavaScript ModuleName.Raw [ModuleName.Raw]
741+ | MakeCannotOptimizeDebugValues ModuleName.Raw [ModuleName.Raw]
742+ | MakeCannotBuild BuildProblem
743+ | MakeCannotLoadArtifacts
1148744
1149− else
1150− toSnippet "PROBLEM WITH CONSTRAINT" Nothing
1151− ( D.reflow $
1152− "I got stuck while reading your elm.json file. I ran into an invalid version constraint:"
1153− , D.fillSep
1154− ["Maybe","you","want","something","like"
1155− ,D.green $ "\"" <> D.fromVersion before <> " <= v < " <> D.fromVersion (V.bumpMajor before) <> "\""
1156− ,"instead?","Elm","checks","that","all","package","APIs","follow","semantic"
1157− ,"versioning,","so","it","is","guaranteed","that","breaking","API","changes"
1158− ,"cannot","happen","in","any","of","the","versions","in","that","range."
1159− ]
1160− )
1161745
1162− OP_BadModuleName row col ->
1163− toSnippet "PROBLEM WITH MODULE NAME" (toHighlight row col)
1164− ( D.reflow $
1165− "I got stuck while reading your elm.json file. I was expecting a module name here:"
1166− , D.fillSep
1167− ["I","need","something","like",D.green "\"Html.Events\""
1168− ,"or",D.green "\"Browser.Navigation\""
1169− ,"where","each","segment","starts","with","a","capital"
1170− ,"letter","and","the","segments","are","separated","by","dots."
1171− ]
1172− )
746+data BuildProblem
747+ = BuildModuleProblems Error.Module [Error.Module]
748+ | BuildProjectProblem BuildProjectProblem
1173749
1174− OP_BadModuleHeaderTooLong ->
1175− toSnippet "HEADER TOO LONG" Nothing
1176− ( D.reflow $
1177− "I got stuck while reading your elm.json file. This section header is too long:"
1178− , D.stack
1179− [ D.fillSep
1180− ["I","need","it","to","be"
1181− ,D.green "under",D.green "20",D.green "bytes"
1182− ,"so","it","renders","nicely","on","the","package","website!"
1183− ]
1184− , D.toSimpleNote
1185− "I count the length in bytes, so using non-ASCII characters costs extra.\
1186− \ Please report your case at https://github.com/elm/compiler/issues if this seems\
1187− \ overly restrictive for your needs."
1188− ]
1189− )
1190750
1191− OP_BadDependencyName row col ->
1192− toSnippet "PROBLEM WITH DEPENDENCY NAME" (toHighlight row col)
1193− ( D.reflow $
1194− "I got stuck while reading your elm.json file. There is something wrong with this dependency name:"
1195− , D.stack
1196− [ D.fillSep
1197− ["Package","names","always","include","the","name","of","the","author,"
1198− ,"so","I","am","expecting","to","see","dependencies","like"
1199− ,D.dullyellow "\"mdgriffith/elm-ui\"","and"
1200− ,D.dullyellow "\"Microsoft/elm-json-tree-view\"" <> "."
1201− ]
1202− , D.fillSep $
1203− ["I","generally","recommend","finding","the","package","you","want","on"
1204− ,"the","package","website,","and","installing","it","with","the"
1205− ,D.green "elm install","command!"
1206− ]
1207− ]
1208− )
751+data BuildProjectProblem
752+ = BP_PathUnknown FilePath
753+ | BP_WithBadExtension FilePath
754+ | BP_WithAmbiguousSrcDir FilePath FilePath
755+ | BP_MainPathDuplicate FilePath FilePath
756+ | BP_MainNameDuplicate ModuleName.Raw FilePath FilePath
757+ | BP_CannotLoadDependencies
758+ | BP_Cycle ModuleName.Raw [ModuleName.Raw]
759+ | BP_MissingExposed (NE.List (ModuleName.Raw, Import.Problem))
1209760
1210− OP_BadLicense _ suggestions ->
1211− toSnippet "UNKNOWN LICENSE" Nothing
1212− ( D.reflow $
1213− "I got stuck while reading your elm.json file. I do not know about this type of license:"
1214− ,
1215− D.stack
1216− [ D.fillSep
1217− ["Elm","packages","generally","use"
1218− ,D.green "\"BSD-3-Clause\"","or",D.green "\"MIT\"" <> ","
1219− ,"but","I","accept","any","OSI","approved","SPDX","license."
1220− ,"Here","some","that","seem","close","to","what","you","wrote:"
1221− ]
1222− , D.indent 4 $ D.dullyellow $ D.vcat $ map (D.fromChars . Json.toChars) suggestions
1223− , D.reflow $
1224− "Check out https://spdx.org/licenses/ for the full list of options."
1225− ]
1226− )
1227761
1228− OP_BadSummaryTooLong ->
1229− toSnippet "SUMMARY TOO LONG" Nothing
1230− ( D.reflow $
1231− "I got stuck while reading your elm.json file. Your \"summary\" is too long:"
1232− , D.stack
1233− [ D.fillSep
1234− ["I","need","it","to","be"
1235− ,D.green "under",D.green "80",D.green "bytes"
1236− ,"so","it","renders","nicely","on","the","package","website!"
1237− ]
1238− , D.toSimpleNote
1239− "I count the length in bytes, so using non-ASCII characters costs extra.\
1240− \ Please report your case at https://github.com/elm/compiler/issues if this seems\
1241− \ overly restrictive for your needs."
1242− ]
1243− )
1244762
1245− OP_NoSrcDirs ->
1246− toSnippet "NO SOURCE DIRECTORIES" Nothing
1247− ( D.reflow $
1248− "I got stuck while reading your elm.json file. You do not have any \"source-directories\" listed here:"
1249− , D.fillSep
1250− ["I","need","something","like",D.green "[\"src\"]"
1251− ,"so","I","know","where","to","look","for","your","modules!"
1252− ]
1253− )
763+-- RENDERERS
1254764
1255765
766+toString :: Help.Report -> String
767+toString report =
768+ Help.toString (Help.reportToDoc report)
1256769
1257−-- DETAILS
1258770
771+toStderr :: Help.Report -> IO ()
772+toStderr report =
773+ Help.toStderr (Help.reportToDoc report)
1259774
1260−data Details
1261− = DetailsNoSolution
1262− | DetailsNoOfflineSolution
1263− | DetailsSolverProblem Solver
1264− | DetailsBadElmInPkg C.Constraint
1265− | DetailsBadElmInAppOutline V.Version
1266− | DetailsHandEditedDependencies
1267− | DetailsBadOutline Outline
1268− | DetailsCannotGetRegistry RegistryProblem
1269− | DetailsBadDeps FilePath [DetailsBadDep]
1270775
776+toJson :: Help.Report -> Encode.Value
777+toJson report =
778+ Help.reportToJson report
1271779
1272−data DetailsBadDep
1273− = BD_BadDownload Pkg.Name V.Version PackageProblem
1274− | BD_BadBuild Pkg.Name V.Version (Map.Map Pkg.Name V.Version)
1275780
1276781
1277−toDetailsReport :: Details -> Help.Report
1278−toDetailsReport details =
1279− case details of
1280− DetailsNoSolution ->
1281− Help.report "INCOMPATIBLE DEPENDENCIES" (Just "elm.json")
1282− "The dependencies in your elm.json are not compatible."
1283− [ D.fillSep
1284− ["Did","you","change","them","by","hand?","Try","to","change","it","back!"
1285− ,"It","is","much","more","reliable","to","add","dependencies","with",D.green "elm install" <> "."
1286− ]
1287− , D.reflow $
1288− "Please ask for help on the community forums if you try those paths and are still\
1289− \ having problems!"
1290− ]
782+-- DETAILS TO REPORT
1291783
1292− DetailsNoOfflineSolution ->
1293− Help.report "TROUBLE VERIFYING DEPENDENCIES" (Just "elm.json")
1294− "I could not connect to https://package.elm-lang.org to get the latest list of\
1295− \ packages, and I was unable to verify your dependencies with the information I\
1296− \ have cached locally."
1297− [ D.reflow $
1298− "Are you able to connect to the internet? These dependencies may work once you\
1299− \ get access to the registry!"
1300− , D.toFancyNote
1301− ["If","you","changed","your","dependencies","by","hand,","try","to","change","them","back!"
1302− ,"It","is","much","more","reliable","to","add","dependencies","with",D.green "elm install" <> "."
1303− ]
1304− ]
1305784
1306− DetailsSolverProblem solver ->
1307− toSolverReport solver
785+detailsToReport :: Details -> Help.Report
786+detailsToReport details =
787+ case details of
788+ DetailsCorrupt ->
789+ error "TODO DetailsCorrupt"
1308790
1309791 DetailsBadElmInPkg constraint ->
1310792 Help.report "ELM VERSION MISMATCH" (Just "elm.json")
@@ -1330,740 +812,376 @@ toDetailsReport details =
1330812 ]
1331813
1332814 DetailsHandEditedDependencies ->
1333− Help.report "ERROR IN DEPENDENCIES" (Just "elm.json")
1334− "It looks like the dependencies elm.json in were edited by hand (or by a 3rd\
1335− \ party tool) leaving them in an invalid state."
1336− [ D.fillSep
1337− ["Try","to","change","them","back","to","what","they","were","before!"
1338− ,"It","is","much","more","reliable","to","add","dependencies","with",D.green "elm install" <> "."
1339− ]
1340− , D.reflow $
1341− "Please ask for help on the community forums if you try those paths and are still\
1342− \ having problems!"
1343− ]
815+ error "TODO DetailsHandEditedDependencies"
1344816
1345817 DetailsBadOutline outline ->
1346818 toOutlineReport outline
1347819
1348820 DetailsCannotGetRegistry problem ->
1349− toRegistryProblemReport "PROBLEM LOADING PACKAGE LIST" problem $
1350− "I need the list of published packages to verify your dependencies"
821+ error "TODO DetailsCannotGetRegistry" problem
1351822
1352− DetailsBadDeps cacheDir deps ->
1353− case List.sortOn toBadDepRank deps of
1354− [] ->
1355− Help.report "PROBLEM BUILDING DEPENDENCIES" Nothing
1356− "I am not sure what is going wrong though."
1357− [ D.reflow $
1358− "I would try deleting the " ++ cacheDir ++ " and elm-stuff/ directories, then\
1359− \ trying to build again. That will work if some cached files got corrupted\
1360− \ somehow."
1361− , D.reflow $
1362− "If that does not work, go to https://elm-lang.org/community and ask for\
1363− \ help. This is a weird case!"
1364− ]
823+ DetailsCannotBuildPackage name version problem ->
824+ error "TODO DetailsCannotBuildPackage" name version problem
825+
826+ DetailsNoSolution ->
827+ error "TODO DetailsNoSolution"
1365828
1366− d:_ ->
1367− case d of
1368− BD_BadDownload pkg vsn packageProblem ->
1369− toPackageProblemReport pkg vsn packageProblem
829+ DetailsNoOfflineSolution ->
830+ error "TODO DetailsNoOfflineSolution"
1370831
1371− BD_BadBuild pkg vsn fingerprint ->
1372− Help.report "PROBLEM BUILDING DEPENDENCIES" Nothing
1373− "I ran into a compilation error when trying to build the following package:"
1374− [ D.indent 4 $ D.red $ D.fromChars $ Pkg.toChars pkg ++ " " ++ V.toChars vsn
1375− , D.reflow $
1376− "This probably means it has package constraints that are too wide. It may be\
1377− \ possible to tweak your elm.json to avoid the root problem as a stopgap. Head\
1378− \ over to https://elm-lang.org/community to get help figuring out how to take\
1379− \ this path!"
1380− , D.toSimpleNote $
1381− "To help with the root problem, please report this to the package author along\
1382− \ with the following information:"
1383− , D.indent 4 $ D.vcat $
1384− map (\(p,v) -> D.fromChars $ Pkg.toChars p ++ " " ++ V.toChars v) $
1385− Map.toList fingerprint
1386− , D.reflow $
1387− "If you want to help out even more, try building the package locally. That should\
1388− \ give you much more specific information about why this package is failing to\
1389− \ build, which will in turn make it easier for the package author to fix it!"
1390− ]
832+ DetailsSolverProblem _ ->
833+ error "TODO DetailsSolverProblem"
1391834
1392835
1393−toBadDepRank :: DetailsBadDep -> Int -- lower is better
1394−toBadDepRank badDep =
1395− case badDep of
1396− BD_BadDownload _ _ _ -> 0
1397− BD_BadBuild _ _ _ -> 1
1398836
837+makeToReport :: Make -> Help.Report
838+makeToReport make =
839+ case make of
840+ MakeNeedsOutline ->
841+ Help.report "NO elm.json FILE" Nothing
842+ "It looks like you are starting a new Elm project. Very exciting! Try running:"
843+ [ D.indent 4 $ D.green $ "elm init"
844+ , D.reflow $
845+ "It will help you get set up. It is really simple!"
846+ ]
1399847
848+ MakeCannotOptimizeAndDebug ->
849+ Help.docReport "CLASHING FLAGS" Nothing
850+ ( D.fillSep
851+ ["I","cannot","compile","with",D.red "--optimize","and"
852+ ,D.red "--debug","at","the","same","time."
853+ ]
854+ )
855+ [ D.reflow
856+ "I need to take away information to optimize things, and I need to\
857+ \ add information to add the debugger. It is impossible to do both\
858+ \ at once though! Pick just one of those flags and it should work!"
859+ ]
1400860
1401−-- PACKAGE PROBLEM
861+ MakeBlockedByDetailsProblem detailsProblem ->
862+ detailsToReport detailsProblem
1402863
864+ MakeAppNeedsFileNames ->
865+ Help.report "NO INPUT" Nothing
866+ "What should I make though? I need a specific file like this:"
867+ [ D.indent 4 $ D.green "elm make src/Main.elm"
868+ , D.reflow
869+ "However many files you give, I will create one JS file out of them."
870+ ]
1403871
1404−data PackageProblem
1405− = PP_BadEndpointRequest Http.Error
1406− | PP_BadEndpointContent String
1407− | PP_BadArchiveRequest Http.Error
1408− | PP_BadArchiveContent String
1409− | PP_BadArchiveHash String String String
872+ MakePkgNeedsExposing ->
873+ error "TODO MakePkgNeedsExposing"
1410874
875+ MakeMultipleFilesIntoHtml ->
876+ error "TODO MakeMultipleFilesIntoHtml"
1411877
1412−toPackageProblemReport :: Pkg.Name -> V.Version -> PackageProblem -> Help.Report
1413−toPackageProblemReport pkg vsn problem =
1414− let
1415− thePackage =
1416− Pkg.toChars pkg ++ " " ++ V.toChars vsn
1417− in
1418− case problem of
1419− PP_BadEndpointRequest httpError ->
1420− toHttpErrorReport "PROBLEM DOWNLOADING PACKAGE" httpError $
1421− "I need to find the latest download link for " ++ thePackage
878+ MakeNonMainFilesIntoJavaScript _ _ ->
879+ error "TODO MakeNonMainFilesIntoJavaScript"
1422880
1423− PP_BadEndpointContent url ->
1424− Help.report "PROBLEM DOWNLOADING PACKAGE" Nothing
1425− (
1426− "I need to find the latest download link for " ++ thePackage ++ ", but I ran into corrupted information from:"
1427− )
1428− [ D.indent 4 $ D.dullyellow $ D.fromChars url
881+ MakeCannotOptimizeDebugValues m ms ->
882+ Help.report "DEBUG REMNANTS" Nothing
883+ "There are uses of the `Debug` module in the following modules:"
884+ [ D.indent 4 $ D.red $ D.vcat $ map (D.fromChars . ModuleName.toChars) (m:ms)
885+ , D.reflow "But the --optimize flag only works if all `Debug` functions are removed!"
886+ , D.toSimpleNote $
887+ "The issue is that --optimize strips out info needed by `Debug` functions.\
888+ \ Here are two examples:"
889+ , D.indent 4 $ D.reflow $
890+ "(1) It shortens record field names. This makes the generated JavaScript is\
891+ \ smaller, but `Debug.toString` cannot know the real field names anymore."
892+ , D.indent 4 $ D.reflow $
893+ "(2) Values like `type Height = Height Float` are unboxed. This reduces\
894+ \ allocation, but it also means that `Debug.toString` cannot tell if it is\
895+ \ looking at a `Height` or `Float` value."
1429896 , D.reflow $
1430− "Is something weird with your internet connection. We have gotten reports that\
1431− \ schools, businesses, airports, etc. sometimes intercept requests and add things\
1432− \ to the body or change its contents entirely. Could that be the problem?"
897+ "There are a few other cases like that, and it will be much worse once we start\
898+ \ inlining code. That optimization could move `Debug.log` and `Debug.todo` calls,\
899+ \ resulting in unpredictable behavior. I hope that clarifies why this restriction\
900+ \ exists!"
1433901 ]
1434902
1435− PP_BadArchiveRequest httpError ->
1436− toHttpErrorReport "PROBLEM DOWNLOADING PACKAGE" httpError $
1437− "I was trying to download the source code for " ++ thePackage
903+ MakeCannotBuild buildProblem ->
904+ case buildProblem of
905+ BuildProjectProblem bp ->
906+ case bp of
907+ BP_PathUnknown _ ->
908+ error "TODO BP_PathUnknown"
1438909
1439− PP_BadArchiveContent url ->
1440− Help.report "PROBLEM DOWNLOADING PACKAGE" Nothing
1441− (
1442− "I downloaded the source code for " ++ thePackage ++ " from:"
1443− )
1444− [ D.indent 4 $ D.dullyellow $ D.fromChars url
1445− , D.reflow $
1446− "But I was unable to unzip the data. Maybe there is something weird with\
1447− \ your internet connection. We have gotten reports that schools, businesses,\
1448− \ airports, etc. sometimes intercept requests and add things to the body or\
1449− \ change its contents entirely. Could that be the problem?"
1450− ]
910+ BP_WithBadExtension _ ->
911+ error "TODO BP_WithBadExtension"
1451912
1452− PP_BadArchiveHash url expectedHash actualHash ->
1453− Help.report "CORRUPT PACKAGE DATA" Nothing
1454− (
1455− "I downloaded the source code for " ++ thePackage ++ " from:"
1456− )
1457− [ D.indent 4 $ D.dullyellow $ D.fromChars url
1458− , D.reflow "But it looks like the hash of the archive has changed since publication:"
1459− , D.vcat $ map D.fromChars $
1460− [ " Expected: " ++ expectedHash
1461− , " Actual: " ++ actualHash
1462− ]
1463− , D.reflow $
1464− "This usually means that the package author moved the version\
1465− \ tag, so report it to them and see if that is the issue. Folks\
1466− \ on Elm slack can probably help as well."
1467− ]
913+ BP_WithAmbiguousSrcDir _ _ ->
914+ error "TODO BP_WithAmbiguousSrcDir"
1468915
916+ BP_MainPathDuplicate _ _ ->
917+ error "TODO BP_MainPathDuplicate"
1469918
919+ BP_MainNameDuplicate _ _ _ ->
920+ error "TODO BP_MainNameDuplicate"
1470921
1471−-- REGISTRY PROBLEM
922+ BP_CannotLoadDependencies ->
923+ error "TODO BP_CannotLoadDependencies"
1472924
925+ BP_Cycle name names ->
926+ Help.report "IMPORT CYCLE" Nothing
927+ "Your module imports form a cycle:"
928+ [ D.cycle 4 name names
929+ , D.reflow $
930+ "Learn more about why this is disallowed and how to break cycles here:"
931+ ++ D.makeLink "import-cycles"
932+ ]
1473933
1474−data RegistryProblem
1475− = RP_Http Http.Error
1476− | RP_Data String BS.ByteString
934+ BP_MissingExposed _ ->
935+ error "TODO BP_MissingExposed"
1477936
937+ BuildModuleProblems p ps ->
938+ Help.compilerReport p ps
1478939
1479−toRegistryProblemReport :: String -> RegistryProblem -> String -> Help.Report
1480−toRegistryProblemReport title problem context =
1481− case problem of
1482− RP_Http err ->
1483− toHttpErrorReport title err context
940+ MakeCannotLoadArtifacts ->
941+ error "TODO MakeCannotLoadArtifacts"
1484942
1485− RP_Data url body ->
1486− Help.report title Nothing (context ++ ", so I fetched:")
1487− [ D.indent 4 $ D.dullyellow $ D.fromChars url
1488− , D.reflow $
1489− "I got the data back, but it was not what I was expecting. The response\
1490− \ body contains " ++ show (BS.length body) ++ " bytes. Here is the "
1491− ++ if BS.length body <= 76 then "whole thing:" else "beginning:"
1492− , D.indent 4 $ D.dullyellow $ D.fromChars $
1493− if BS.length body <= 76
1494− then BS_UTF8.toString body
1495− else take 73 (BS_UTF8.toString body) ++ "..."
1496− , D.reflow $
1497− "Does this error keep showing up? Maybe there is something weird with your\
1498− \ internet connection. We have gotten reports that schools, businesses,\
1499− \ airports, etc. sometimes intercept requests and add things to the body\
1500− \ or change its contents entirely. Could that be the problem?"
1501− ]
1502943
1503944
1504−toHttpErrorReport :: String -> Http.Error -> String -> Help.Report
1505−toHttpErrorReport title err context =
1506− let
1507− toHttpReport intro url details =
1508− Help.report title Nothing intro $
1509− D.indent 4 (D.dullyellow (D.fromChars url)) : details
1510− in
1511− case err of
1512− Http.BadUrl url reason ->
1513− toHttpReport (context ++ ", so I wanted to fetch:") url
1514− [ D.reflow $ "But my HTTP library is saying this is not a valid URL. It is saying:"
1515− , D.indent 4 $ D.fromChars reason
1516− , D.reflow $
1517− "This may indicate that there is some problem in the compiler, so please open an\
1518− \ issue at https://github.com/elm/compiler/issues listing your operating system, Elm\
1519− \ version, the command you ran, the terminal output, and any additional information\
1520− \ that might help others reproduce the error."
1521− ]
945+-- OUTLINE
1522946
1523− Http.BadHttp url httpExceptionContent ->
1524− case httpExceptionContent of
1525− HTTP.StatusCodeException response body ->
1526− let
1527− (HTTP.Status code message) = HTTP.responseStatus response
1528− in
1529− toHttpReport (context ++ ", so I tried to fetch:") url
1530− [ D.fillSep $
1531− ["But","it","came","back","as",D.red (D.fromInt code)]
1532− ++ map D.fromChars (words (BS_UTF8.toString message))
1533− , D.indent 4 $ D.reflow $ BS_UTF8.toString body
1534− , D.reflow $
1535− "This may mean some online endpoint changed in an unexpected way, so if does not\
1536− \ seem like something on your side is causing this (e.g. firewall) please report\
1537− \ this to https://github.com/elm/compiler/issues with your operating system, Elm\
1538− \ version, the command you ran, the terminal output, and any additional information\
1539− \ that can help others reproduce the error!"
1540− ]
1541947
1542− HTTP.TooManyRedirects responses ->
1543− toHttpReport (context ++ ", so I tried to fetch:") url
1544− [ D.reflow $ "But I gave up after following these " ++ show (length responses) ++ " redirects:"
1545− , D.indent 4 $ D.vcat $ map toRedirectDoc responses
948+toOutlineReport :: Outline -> Help.Report
949+toOutlineReport problem =
950+ case problem of
951+ OutlineHasBadStructure decodeError ->
952+ Json.toReport "elm.json" (Json.FailureToReport toOutlineProblemReport) decodeError
953+
954+ OutlineHasBadSrcDirs dir dirs ->
955+ case dirs of
956+ [] ->
957+ Help.report "MISSING SOURCE DIRECTORY" (Just "elm.json")
958+ "The \"source-directories\" in your elm.json lists the following directory:"
959+ [ D.indent 4 $ D.dullyellow $ D.fromChars dir
1546960 , D.reflow $
1547− "Is it possible that your internet connection intercepts certain requests? That\
1548− \ sometimes causes problems for folks in schools, businesses, airports, hotels,\
1549− \ and certain countries. Try asking for help locally or in a community forum!"
961+ "I cannot find it though. Is it missing? Is there a typo?"
1550962 ]
1551963
1552− otherException ->
1553− toHttpReport (context ++ ", so I tried to fetch:") url
1554− [ D.reflow $ "But my HTTP library is giving me the following error message:"
1555− , D.indent 4 $ D.fromChars (show otherException)
964+ _:_ ->
965+ Help.report "MISSING SOURCE DIRECTORIES" (Just "elm.json")
966+ "The \"source-directories\" in your elm.json lists the following directories:"
967+ [ D.indent 4 $ D.dullyellow $ D.fromChars dir
1556968 , D.reflow $
1557− "Are you somewhere with a slow internet connection? Or no internet?\
1558− \ Does the link I am trying to fetch work in your browser? Maybe the\
1559− \ site is down? Does your internet connection have a firewall that\
1560− \ blocks certain domains? It is usually something like that!"
969+ "I cannot find them though. Are they missing? Are there typos?"
1561970 ]
1562971
1563− Http.BadMystery url someException ->
1564− toHttpReport (context ++ ", so I tried to fetch:") url
1565− [ D.reflow $ "But I ran into something weird! I was able to extract this error message:"
1566− , D.indent 4 $ D.fromChars (show someException)
1567− , D.reflow $
1568− "Is it possible that your internet connection intercepts certain requests? That\
1569− \ sometimes causes problems for folks in schools, businesses, airports, hotels,\
1570− \ and certain countries. Try asking for help locally or in a community forum!"
972+ OutlineNoPkgCore ->
973+ Help.report "MISSING DEPENDENCY" (Just "elm.json")
974+ "A package must have \"elm/core\" as a dependency. Try running:"
975+ [ D.indent 4 $ D.green $ "elm install elm/core"
976+ , D.reflow "I need it for the default imports that make `List` and `Maybe` available."
1571977 ]
1572978
979+ OutlineNoAppCore ->
980+ Help.report "MISSING DEPENDENCY" (Just "elm.json")
981+ "An application must have \"elm/core\" as a dependency. Try running:"
982+ [ D.indent 4 $ D.green $ "elm install elm/core"
983+ , D.reflow "It has some supporting code that is needed by every Elm application!"
984+ ]
1573985
1574−toRedirectDoc :: HTTP.Response body -> D.Doc
1575−toRedirectDoc response =
1576− let
1577− (HTTP.Status code message) = HTTP.responseStatus response
1578− in
1579− case List.lookup HTTP.hLocation (HTTP.responseHeaders response) of
1580− Just loc -> D.red (D.fromInt code) <> " - " <> D.fromChars (BS_UTF8.toString loc)
1581− Nothing -> D.red (D.fromInt code) <> " - " <> D.fromChars (BS_UTF8.toString message)
1582−
986+ OutlineNoAppJson ->
987+ Help.report "MISSING DEPENDENCY" (Just "elm.json")
988+ "An application must have \"elm/json\" as a dependency. Try running:"
989+ [ D.indent 4 $ D.green $ "elm install elm/json"
990+ , D.reflow "It helps me handle flags and ports."
991+ ]
1583992
1584993
1585−-- MAKE
994+toOutlineProblemReport :: FilePath -> Code.Source -> Json.Context -> A.Region -> OutlineProblem -> Help.Report
995+toOutlineProblemReport path source _ region problem =
996+ let
997+ toHighlight row col =
998+ Just $ A.Region (A.Position row col) (A.Position row col)
1586999
1587−
1588−data Make
1589− = MakeNoOutline
1590− | MakeCannotOptimizeAndDebug
1591− | MakeBadDetails Details
1592− | MakeAppNeedsFileNames
1593− | MakePkgNeedsExposing
1594− | MakeMultipleFilesIntoHtml
1595− | MakeNoMain
1596− | MakeNonMainFilesIntoJavaScript ModuleName.Raw [ModuleName.Raw]
1597− | MakeCannotBuild BuildProblem
1598− | MakeBadGenerate Generate
1599−
1600−
1601−makeToReport :: Make -> Help.Report
1602−makeToReport make =
1603− case make of
1604− MakeNoOutline ->
1605− Help.report "NO elm.json FILE" Nothing
1606− "It looks like you are starting a new Elm project. Very exciting! Try running:"
1607− [ D.indent 4 $ D.green $ "elm init"
1608− , D.reflow $
1609− "It will help you get set up. It is really simple!"
1610− ]
1611−
1612− MakeCannotOptimizeAndDebug ->
1613− Help.docReport "CLASHING FLAGS" Nothing
1614− ( D.fillSep
1615− ["I","cannot","compile","with",D.red "--optimize","and"
1616− ,D.red "--debug","at","the","same","time."
1000+ toSnippet title highlight pair =
1001+ Help.jsonReport title (Just path) $
1002+ Code.toSnippet source region highlight pair
1003+ in
1004+ case problem of
1005+ OP_BadType ->
1006+ toSnippet "UNEXPECTED TYPE" Nothing
1007+ ( D.reflow $
1008+ "I do not know how to process this type of elm.json file:"
1009+ , D.fillSep
1010+ ["Try","changing","the","type","to"
1011+ ,D.green "\"application\"","or",D.green "\"package\"","instead."
16171012 ]
16181013 )
1619− [ D.reflow
1620− "I need to take away information to optimize things, and I need to\
1621− \ add information to add the debugger. It is impossible to do both\
1622− \ at once though! Pick just one of those flags and it should work!"
1623− ]
1624−
1625− MakeBadDetails detailsProblem ->
1626− toDetailsReport detailsProblem
16271014
1628− MakeAppNeedsFileNames ->
1629− Help.report "NO INPUT" Nothing
1630− "What should I make though? I need specific files like:"
1631− [ D.vcat
1632− [ D.indent 4 $ D.green "elm make src/Main.elm"
1633− , D.indent 4 $ D.green "elm make src/This.elm src/That.elm"
1634− ]
1635− , D.reflow $
1636− "I recommend reading through https://guide.elm-lang.org for guidance on what to\
1637− \ actually put in those files!"
1638− ]
1639−
1640− MakePkgNeedsExposing ->
1641− Help.report "NO INPUT" Nothing
1642− "What should I make though? I need specific files like:"
1643− [ D.vcat
1644− [ D.indent 4 $ D.green "elm make src/Main.elm"
1645− , D.indent 4 $ D.green "elm make src/This.elm src/That.elm"
1015+ OP_BadPkgName row col ->
1016+ toSnippet "INVALID PACKAGE NAME" (toHighlight row col)
1017+ ( D.reflow $
1018+ "I ran into trouble with this package name:"
1019+ , D.stack
1020+ [ D.fillSep
1021+ ["Package","names","are","always","written","as"
1022+ ,D.green "\"author/project\""
1023+ ,"so","I","am","expecting","to","see","something","like:"
1024+ ]
1025+ , D.dullyellow $ D.indent 4 $ D.vcat $
1026+ [ "\"mdgriffith/elm-ui\""
1027+ , "\"w0rm/elm-physics\""
1028+ , "\"Microsoft/elm-json-tree-view\""
1029+ , "\"FordLabs/elm-star-rating\""
1030+ , "\"1602/json-schema\""
1031+ ]
1032+ , D.reflow
1033+ "The author name should match your GitHub name exactly, and the project name\
1034+ \ needs to follow these rules:"
1035+ , D.indent 4 $ D.vcat $
1036+ [ "+--------------------------------------+-----------+-----------+"
1037+ , "| RULE | BAD | GOOD |"
1038+ , "+--------------------------------------+-----------+-----------+"
1039+ , "| only lower case, digits, and hyphens | elm-HTTP | elm-http |"
1040+ , "| no leading digits | 3D | elm-3d |"
1041+ , "| no non-ASCII characters | elm-bjørn | elm-bear |"
1042+ , "| no underscores | elm_ui | elm-ui |"
1043+ , "| no double hyphens | elm--hash | elm-hash |"
1044+ , "| no starting or ending hyphen | -elm-tar- | elm-tar |"
1045+ , "+--------------------------------------+-----------+-----------+"
1046+ ]
1047+ , D.toSimpleNote $
1048+ "These rules only apply to the project name, so you should never need\
1049+ \ to change your GitHub name!"
16461050 ]
1647− , D.reflow $
1648− "You can also entries to the \"exposed-modules\" list in your elm.json file, and\
1649− \ I will try to compile the relevant files."
1650− ]
1651−
1652− MakeMultipleFilesIntoHtml ->
1653− Help.report "TOO MANY FILES" Nothing
1654− (
1655− "When producing an HTML file, I can only handle one file."
16561051 )
1657− [ D.fillSep
1658− ["Switch","to",D.dullyellow "--output=/dev/null","if","you","just","want"
1659− ,"to","get","compile","errors.","This","skips","the","code","gen","phase,"
1660− ,"so","it","can","be","a","bit","faster","than","other","options","sometimes."
1661− ]
1052+
1053+ OP_BadVersion row col ->
1054+ toSnippet "PROBLEM WITH VERSION" (toHighlight row col)
1055+ ( D.reflow $
1056+ "I was expecting a version number here:"
16621057 , D.fillSep
1663− ["Switch","to",D.dullyellow "--output=elm.js","if","you","want","multiple"
1664− ,"`main`","values","available","in","a","single","JavaScript","file.","Then"
1665− ,"you","can","make","your","own","customized","HTML","file","that","embeds"
1666− ,"multiple","Elm","nodes.","The","generated","JavaScript","also","shares"
1667− ,"dependencies","between","modules,","so","it","should","be","smaller","than"
1668− ,"compiling","each","module","separately."
1058+ ["I","need","something","like",D.green "\"1.0.0\"","or",D.green "\"2.0.4\""
1059+ ,"that","explicitly","states","all","three","numbers!"
16691060 ]
1670− ]
1671−
1672− MakeNoMain ->
1673− Help.report "NO MAIN" Nothing
1674− (
1675− "When producing an HTML file, I require that the given file has a `main` value.\
1676− \ That way I have something to show on screen!"
16771061 )
1678− [ D.reflow $
1679− "Try adding a `main` value to your file? Or if you just want to verify that this\
1680− \ module compiles, switch to --output=/dev/null to skip the code gen phase\
1681− \ altogether."
1682− , D.toSimpleNote $
1683− "Adding a `main` value can be as brief as adding something like this:"
1684− , D.vcat
1685− [ D.fillSep [D.cyan "import","Html"]
1686− , ""
1687− , D.fillSep [D.green "main","="]
1688− , D.indent 2 $ D.fillSep [D.cyan "Html" <> ".text",D.dullyellow "\"Hello!\""]
1689− ]
1690− , D.reflow $
1691− "From there I can create an HTML file that says \"Hello!\" on screen. I recommend\
1692− \ looking through https://guide.elm-lang.org for more guidance on how to fill in\
1693− \ the `main` value."
1694− ]
16951062
1696− MakeNonMainFilesIntoJavaScript m ms ->
1697− case ms of
1698− [] ->
1699− Help.report "NO MAIN" Nothing
1700− (
1701− "When producing a JS file, I require that the given file has a `main` value. That\
1702− \ way Elm." ++ ModuleName.toChars m ++ ".init() is definitely defined in the\
1703− \ resulting file!"
1704− )
1705− [ D.reflow $
1706− "Try adding a `main` value to your file? Or if you just want to verify that this\
1707− \ module compiles, switch to --output=/dev/null to skip the code gen phase\
1708− \ altogether."
1709− , D.toSimpleNote $
1710− "Adding a `main` value can be as brief as adding something like this:"
1711− , D.vcat
1712− [ D.fillSep [D.cyan "import","Html"]
1713− , ""
1714− , D.fillSep [D.green "main","="]
1715− , D.indent 2 $ D.fillSep [D.cyan "Html" <> ".text",D.dullyellow "\"Hello!\""]
1063+ OP_BadConstraint constraintError ->
1064+ case constraintError of
1065+ C.BadFormat row col ->
1066+ toSnippet "PROBLEM WITH CONSTRAINT" (toHighlight row col)
1067+ ( D.reflow $
1068+ "I was expecting a version constraint here:"
1069+ , D.stack
1070+ [ D.fillSep
1071+ ["I","need","something","like",D.green "\"1.0.0 <= v < 2.0.0\""
1072+ ,"that","explicitly","lists","the","lower","and","upper","bounds."
1073+ ]
1074+ , D.toSimpleNote $
1075+ "The spaces in there are required! Taking them out will confuse me. Adding\
1076+ \ extra spaces confuses me too. I recommend starting with a valid example\
1077+ \ and just changing the version numbers."
17161078 ]
1717− , D.reflow $
1718− "Or use https://package.elm-lang.org/packages/elm/core/latest/Platform#worker to\
1719− \ make a `main` with no user interface."
1720− ]
1721−
1722− _:_ ->
1723− Help.report "NO MAIN" Nothing
1724− (
1725− "When producing a JS file, I require that given files all have `main` values.\
1726− \ That way functions like Elm." ++ ModuleName.toChars m ++ ".init() are\
1727− \ definitely defined in the resulting file. I am missing `main` values in:"
17281079 )
1729− [ D.indent 4 $ D.red $ D.vcat $ map D.fromName (m:ms)
1730− , D.reflow $
1731− "Try adding a `main` value to them? Or if you just want to verify that these\
1732− \ modules compile, switch to --output=/dev/null to skip the code gen phase\
1733− \ altogether."
1734− , D.toSimpleNote $
1735− "Adding a `main` value can be as brief as adding something like this:"
1736− , D.vcat
1737− [ D.fillSep [D.cyan "import","Html"]
1738− , ""
1739− , D.fillSep [D.green "main","="]
1740− , D.indent 2 $ D.fillSep [D.cyan "Html" <> ".text",D.dullyellow "\"Hello!\""]
1741− ]
1742− , D.reflow $
1743− "Or use https://package.elm-lang.org/packages/elm/core/latest/Platform#worker to\
1744− \ make a `main` with no user interface."
1745− ]
1746−
1747− MakeCannotBuild buildProblem ->
1748− toBuildProblemReport buildProblem
1749−
1750− MakeBadGenerate generateProblem ->
1751− toGenerateReport generateProblem
1752−
1753−
1754−
1755−-- BUILD PROBLEM
1756−
1757−
1758−data BuildProblem
1759− = BuildBadModules FilePath Error.Module [Error.Module]
1760− | BuildProjectProblem BuildProjectProblem
1761−
1762−
1763−data BuildProjectProblem
1764− = BP_PathUnknown FilePath
1765− | BP_WithBadExtension FilePath
1766− | BP_WithAmbiguousSrcDir FilePath FilePath FilePath
1767− | BP_MainPathDuplicate FilePath FilePath
1768− | BP_RootNameDuplicate ModuleName.Raw FilePath FilePath
1769− | BP_RootNameInvalid FilePath FilePath [String]
1770− | BP_CannotLoadDependencies
1771− | BP_Cycle ModuleName.Raw [ModuleName.Raw]
1772− | BP_MissingExposed (NE.List (ModuleName.Raw, Import.Problem))
1773−
1774−
1775−toBuildProblemReport :: BuildProblem -> Help.Report
1776−toBuildProblemReport problem =
1777− case problem of
1778− BuildBadModules root e es ->
1779− Help.compilerReport root e es
1780−
1781− BuildProjectProblem projectProblem ->
1782− toProjectProblemReport projectProblem
1783−
1784−
1785−toProjectProblemReport :: BuildProjectProblem -> Help.Report
1786−toProjectProblemReport projectProblem =
1787− case projectProblem of
1788− BP_PathUnknown path ->
1789− Help.report "FILE NOT FOUND" Nothing
1790− "I cannot find this file:"
1791− [ D.indent 4 $ D.red $ D.fromChars path
1792− , D.reflow $ "Is there a typo?"
1793− , D.toSimpleNote $
1794− "If you are just getting started, try working through the examples in the\
1795− \ official guide https://guide.elm-lang.org to get an idea of the kinds of things\
1796− \ that typically go in a src/Main.elm file."
1797− ]
17981080
1799− BP_WithBadExtension path ->
1800− Help.report "UNEXPECTED FILE EXTENSION" Nothing
1801− "I can only compile Elm files (with a .elm extension) but you want me to compile:"
1802− [ D.indent 4 $ D.red $ D.fromChars path
1803− , D.reflow $ "Is there a typo? Can the file extension be changed?"
1804− ]
1805−
1806− BP_WithAmbiguousSrcDir path srcDir1 srcDir2 ->
1807− Help.report "CONFUSING FILE" Nothing
1808− "I am getting confused when I try to compile this file:"
1809− [ D.indent 4 $ D.red $ D.fromChars path
1810− , D.reflow $
1811− "I always check if files appear in any of the \"source-directories\" listed in\
1812− \ your elm.json to see if there might be some cached information about them. That\
1813− \ can help me compile faster! But in this case, it looks like this file may be in\
1814− \ either of these directories:"
1815− , D.indent 4 $ D.red $ D.vcat $ map D.fromChars [srcDir1,srcDir2]
1816− , D.reflow $
1817− "Try to make it so no source directory contains another source directory!"
1818− ]
1819−
1820− BP_MainPathDuplicate path1 path2 ->
1821− Help.report "CONFUSING FILES" Nothing
1822− "You are telling me to compile these two files:"
1823− [ D.indent 4 $ D.red $ D.vcat $ map D.fromChars [ path1, path2 ]
1824− , D.reflow $
1825− if path1 == path2 then
1826− "Why are you telling me twice? Is something weird going on with a script?\
1827− \ I figured I would let you know about it just in case something is wrong.\
1828− \ Only list it once and you should be all set!"
1829− else
1830− "But seem to be the same file though... It makes me think something tricky is\
1831− \ going on with symlinks in your project, so I figured I would let you know\
1832− \ about it just in case. Remove one of these files from your command to get\
1833− \ unstuck!"
1834− ]
1835−
1836− BP_RootNameDuplicate name outsidePath otherPath ->
1837− Help.report "MODULE NAME CLASH" Nothing
1838− "These two files are causing a module name clash:"
1839− [ D.indent 4 $ D.red $ D.vcat $ map D.fromChars [ outsidePath, otherPath ]
1840− , D.reflow $
1841− "They both say `module " ++ ModuleName.toChars name ++ " exposing (..)` up\
1842− \ at the top, but they cannot have the same name!"
1843− , D.reflow $
1844− "Try changing to a different module name in one of them!"
1845− ]
1846−
1847− BP_RootNameInvalid givenPath srcDir _ ->
1848− Help.report "UNEXPECTED FILE NAME" Nothing
1849− "I am having trouble with this file name:"
1850− [ D.indent 4 $ D.red $ D.fromChars givenPath
1851− , D.reflow $
1852− "I found it in your " ++ FP.addTrailingPathSeparator srcDir ++ " directory\
1853− \ which is good, but I expect all of the files in there to use the following\
1854− \ module naming convention:"
1855− , toModuleNameConventionTable srcDir [ "Main", "HomePage", "Http.Helpers" ]
1856− , D.reflow $
1857− "Notice that the names always start with capital letters! Can you make your file\
1858− \ use this naming convention?"
1859− , D.toSimpleNote $
1860− "Having a strict naming convention like this makes it a lot easier to find\
1861− \ things in large projects. If you see a module imported, you know where to look\
1862− \ for the corresponding file every time!"
1863− ]
1864−
1865− BP_CannotLoadDependencies ->
1866− corruptCacheReport
1081+ C.InvalidRange before after ->
1082+ if before == after then
1083+ toSnippet "PROBLEM WITH CONSTRAINT" Nothing
1084+ ( D.reflow $
1085+ "I ran into an invalid version constraint:"
1086+ , D.fillSep
1087+ ["Elm","checks","that","all","package","APIs","follow","semantic","versioning,"
1088+ ,"so","it","is","best","to","use","wide","constraints.","I","recommend"
1089+ ,D.green $ "\"" <> D.fromVersion before <> " <= v < " <> D.fromVersion (V.bumpMajor after) <> "\""
1090+ ,"since","it","is","guaranteed","that","breaking","API","changes","cannot"
1091+ ,"happen","in","any","of","the","versions","in","that","range."
1092+ ]
1093+ )
18671094
1868− BP_Cycle name names ->
1869− Help.report "IMPORT CYCLE" Nothing
1870− "Your module imports form a cycle:"
1871− [ D.cycle 4 name names
1872− , D.reflow $
1873− "Learn more about why this is disallowed and how to break cycles here:"
1874− ++ D.makeLink "import-cycles"
1875− ]
1095+ else
1096+ toSnippet "PROBLEM WITH CONSTRAINT" Nothing
1097+ ( D.reflow $
1098+ "I ran into an invalid version constraint:"
1099+ , D.fillSep
1100+ ["Maybe","you","want","something","like"
1101+ ,D.green $ "\"" <> D.fromVersion before <> " <= v < " <> D.fromVersion (V.bumpMajor before) <> "\""
1102+ ,"instead?","Elm","checks","that","all","package","APIs","follow","semantic"
1103+ ,"versioning,","so","it","is","guaranteed","that","breaking","API","changes"
1104+ ,"cannot","happen","in","any","of","the","versions","in","that","range."
1105+ ]
1106+ )
18761107
1877− BP_MissingExposed (NE.List (name, problem) _) ->
1878− case problem of
1879− Import.NotFound ->
1880− Help.report "MISSING MODULE" (Just "elm.json")
1881− "The \"exposed-modules\" of your elm.json lists the following module:"
1882− [ D.indent 4 $ D.red $ D.fromName name
1883− , D.reflow $
1884− "But I cannot find it in your src/ directory. Is there a typo? Was it renamed?"
1108+ OP_BadModuleName row col ->
1109+ toSnippet "PROBLEM WITH MODULE NAME" (toHighlight row col)
1110+ ( D.reflow $
1111+ "I was expecting a module name here:"
1112+ , D.fillSep
1113+ ["I","need","something","like",D.green "\"Html.Events\""
1114+ ,"or",D.green "\"Browser.Navigation\""
1115+ ,"where","each","segment","starts","with","a","capital"
1116+ ,"letter","and","the","segments","are","separated","by","dots."
18851117 ]
1118+ )
18861119
1887− Import.Ambiguous _ _ pkg _ ->
1888− Help.report "AMBIGUOUS MODULE NAME" (Just "elm.json")
1889− "The \"exposed-modules\" of your elm.json lists the following module:"
1890− [ D.indent 4 $ D.red $ D.fromName name
1891− , D.reflow $
1892− "But a module from " ++ Pkg.toChars pkg ++ " already uses that name. Try\
1893− \ choosing a different name for your local file."
1120+ OP_BadModuleHeaderTooLong ->
1121+ toSnippet "HEADER TOO LONG" Nothing
1122+ ( D.reflow $
1123+ "This section header is too long:"
1124+ , D.fillSep
1125+ ["I","need","it","to","be"
1126+ ,D.green "under",D.green "20",D.green "characters"
1127+ ,"so","it","renders","nicely","on","the","package","website!"
18941128 ]
1129+ )
18951130
1896− Import.AmbiguousLocal path1 path2 paths ->
1897− Help.report "AMBIGUOUS MODULE NAME" (Just "elm.json")
1898− "The \"exposed-modules\" of your elm.json lists the following module:"
1899− [ D.indent 4 $ D.red $ D.fromName name
1900− , D.reflow $
1901− "But I found multiple files with that name:"
1902− , D.dullyellow $ D.indent 4 $ D.vcat $
1903− map D.fromChars (path1:path2:paths)
1904− , D.reflow $
1905− "Change the module names to be distinct!"
1131+ OP_BadDependencyName row col ->
1132+ toSnippet "PROBLEM WITH DEPENDENCY NAME" (toHighlight row col)
1133+ ( D.reflow $
1134+ "There is something wrong with this dependency name:"
1135+ , D.stack
1136+ [ D.fillSep
1137+ ["Package","names","always","include","the","name","of","the","author,"
1138+ ,"so","I","am","expecting","to","see","dependencies","like"
1139+ ,D.dullyellow "\"mdgriffith/elm-ui\"","and"
1140+ ,D.dullyellow "\"Microsoft/elm-json-tree-view\"" <> "."
1141+ ]
1142+ , D.fillSep $
1143+ ["I","generally","recommend","finding","the","package","you","want","on"
1144+ ,"the","package","website,","and","installing","it","with","the"
1145+ ,D.green "elm install","command!"
1146+ ]
19061147 ]
1148+ )
19071149
1908− Import.AmbiguousForeign _ _ _ ->
1909− Help.report "MISSING MODULE" (Just "elm.json")
1910− "The \"exposed-modules\" of your elm.json lists the following module:"
1911− [ D.indent 4 $ D.red $ D.fromName name
1150+ OP_BadLicense _ suggestions ->
1151+ toSnippet "UNKNOWN LICENSE" Nothing
1152+ ( D.reflow $
1153+ "I do not know about this type of license:"
1154+ ,
1155+ D.stack
1156+ [ D.fillSep
1157+ ["Elm","packages","generally","use"
1158+ ,D.green "\"BSD-3-Clause\"","or",D.green "\"MIT\"" <> ","
1159+ ,"but","I","accept","any","OSI","approved","SPDX","license."
1160+ ,"Here","some","that","seem","close","to","what","you","wrote:"
1161+ ]
1162+ , D.indent 4 $ D.dullyellow $ D.vcat $ map (D.fromChars . Json.toChars) suggestions
19121163 , D.reflow $
1913− "But I cannot find it in your src/ directory. Is there a typo? Was it renamed?"
1914− , D.toSimpleNote $
1915− "It is not possible to \"re-export\" modules from other packages. You can only\
1916− \ expose modules that you define in your own code."
1164+ "Check out https://spdx.org/licenses/ for the full list of options."
19171165 ]
1166+ )
19181167
1168+ OP_BadSummaryTooLong ->
1169+ toSnippet "SUMMARY TOO LONG" Nothing
1170+ ( D.reflow $
1171+ "Your \"summary\" is too long:"
1172+ , D.fillSep
1173+ ["I","need","it","to","be"
1174+ ,D.green "under",D.green "80",D.green "characters"
1175+ ,"so","it","renders","nicely","on","the","package","website!"
1176+ ]
1177+ )
19191178
1920−toModuleNameConventionTable :: FilePath -> [String] -> D.Doc
1921−toModuleNameConventionTable srcDir names =
1922− let
1923− toPair name =
1924− ( name
1925− , srcDir </> map (\c -> if c == '.' then FP.pathSeparator else c) name <.> "elm"
1926− )
1927−
1928− namePairs = map toPair names
1929− nameWidth = maximum (11 : map (length . fst) namePairs)
1930− pathWidth = maximum ( 9 : map (length . snd) namePairs)
1931−
1932− padded width str =
1933− str ++ replicate (width - length str) ' '
1934−
1935− toRow (name, path) =
1936− D.fromChars $
1937− "| " ++ padded nameWidth name ++ " | " ++ padded pathWidth path ++ " |"
1938−
1939− bar =
1940− D.fromChars $
1941− "+-" ++ replicate nameWidth '-' ++ "-+-" ++ replicate pathWidth '-' ++ "-+"
1942− in
1943− D.indent 4 $ D.vcat $
1944− [ bar, toRow ("Module Name", "File Path"), bar ] ++ map toRow namePairs ++ [ bar ]
1945−
1946−
1947−
1948−-- GENERATE
1949−
1950−
1951−data Generate
1952− = GenerateCannotLoadArtifacts
1953− | GenerateCannotOptimizeDebugValues ModuleName.Raw [ModuleName.Raw]
1954−
1955−
1956−toGenerateReport :: Generate -> Help.Report
1957−toGenerateReport problem =
1958− case problem of
1959− GenerateCannotLoadArtifacts ->
1960− corruptCacheReport
1961−
1962− GenerateCannotOptimizeDebugValues m ms ->
1963− Help.report "DEBUG REMNANTS" Nothing
1964− "There are uses of the `Debug` module in the following modules:"
1965− [ D.indent 4 $ D.red $ D.vcat $ map (D.fromChars . ModuleName.toChars) (m:ms)
1966− , D.reflow "But the --optimize flag only works if all `Debug` functions are removed!"
1967− , D.toSimpleNote $
1968− "The issue is that --optimize strips out info needed by `Debug` functions.\
1969− \ Here are two examples:"
1970− , D.indent 4 $ D.reflow $
1971− "(1) It shortens record field names. This makes the generated JavaScript\
1972− \ smaller, but `Debug.toString` cannot know the real field names anymore."
1973− , D.indent 4 $ D.reflow $
1974− "(2) Values like `type Height = Height Float` are unboxed. This reduces\
1975− \ allocation, but it also means that `Debug.toString` cannot tell if it is\
1976− \ looking at a `Height` or `Float` value."
1977− , D.reflow $
1978− "There are a few other cases like that, and it will be much worse once we start\
1979− \ inlining code. That optimization could move `Debug.log` and `Debug.todo` calls,\
1980− \ resulting in unpredictable behavior. I hope that clarifies why this restriction\
1981− \ exists!"
1982− ]
1983−
1984−
1985−
1986−-- CORRUPT CACHE
1987−
1988−
1989−corruptCacheReport :: Help.Report
1990−corruptCacheReport =
1991− Help.report "CORRUPT CACHE" Nothing
1992− "It looks like some of the information cached in elm-stuff/ has been corrupted."
1993− [ D.reflow $
1994− "Try deleting your elm-stuff/ directory to get unstuck."
1995− , D.toSimpleNote $
1996− "This almost certainly means that a 3rd party tool (or editor plugin) is\
1997− \ causing problems your the elm-stuff/ directory. Try disabling 3rd party tools\
1998− \ one by one until you figure out which it is!"
1999− ]
2000−
2001−
2002−
2003−-- REACTOR
2004−
2005−
2006−data Reactor
2007− = ReactorNoOutline
2008− | ReactorBadDetails Details
2009− | ReactorBadBuild BuildProblem
2010− | ReactorBadGenerate Generate
2011−
2012−
2013−reactorToReport :: Reactor -> Help.Report
2014−reactorToReport problem =
2015− case problem of
2016− ReactorNoOutline ->
2017− Help.report "NEW PROJECT?" Nothing
2018− "Are you trying to start a new project? Try this command in the terminal:"
2019− [ D.indent 4 $ D.green "elm init"
2020− , D.reflow "It will help you get started!"
2021− ]
2022−
2023− ReactorBadDetails details ->
2024− toDetailsReport details
2025−
2026− ReactorBadBuild buildProblem ->
2027− toBuildProblemReport buildProblem
2028−
2029− ReactorBadGenerate generate ->
2030− toGenerateReport generate
2031−
2032−
2033−
2034−-- REPL
2035−
2036−
2037−data Repl
2038− = ReplBadDetails Details
2039− | ReplBadInput BS.ByteString Error.Error
2040− | ReplBadLocalDeps FilePath Error.Module [Error.Module]
2041− | ReplProjectProblem BuildProjectProblem
2042− | ReplBadGenerate Generate
2043− | ReplBadCache
2044− | ReplBlocked
2045−
2046−
2047−replToReport :: Repl -> Help.Report
2048−replToReport problem =
2049− case problem of
2050− ReplBadDetails details ->
2051− toDetailsReport details
2052−
2053− ReplBadInput source err ->
2054− Help.compilerReport "/" (Error.Module N.replModule "REPL" File.zeroTime source err) []
2055−
2056− ReplBadLocalDeps root e es ->
2057− Help.compilerReport root e es
2058−
2059− ReplProjectProblem projectProblem ->
2060− toProjectProblemReport projectProblem
2061−
2062− ReplBadGenerate generate ->
2063− toGenerateReport generate
2064−
2065− ReplBadCache ->
2066− corruptCacheReport
2067−
2068− ReplBlocked ->
2069− corruptCacheReport
1179+ OP_NoSrcDirs ->
1180+ toSnippet "NO SOURCE DIRECTORIES" Nothing
1181+ ( D.reflow $
1182+ "You do not have any \"source-directories\" listed here:"
1183+ , D.fillSep
1184+ ["I","need","something","like",D.green "[\"src\"]"
1185+ ,"so","I","know","where","to","look","for","your","modules!"
1186+ ]
1187+ )