elm-pages 3.0.0-beta.1 → 3.0.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +10 -1
  2. package/codegen/elm-pages-codegen.js +803 -284
  3. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  4. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  5. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  6. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  7. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  8. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  9. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
  10. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1326 -121
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +15368 -13272
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  13. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +1 -1
  14. package/generator/dead-code-review/elm.json +6 -5
  15. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +141 -17
  16. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +218 -0
  17. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  18. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  19. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  20. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  21. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1326 -121
  22. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +14574 -12631
  23. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  24. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +1 -1
  25. package/generator/review/elm.json +6 -6
  26. package/generator/src/SharedTemplate.elm +1 -1
  27. package/generator/src/build.js +81 -51
  28. package/generator/src/cli.js +120 -42
  29. package/generator/src/codegen.js +11 -10
  30. package/generator/src/compatibility-key.js +1 -0
  31. package/generator/src/config.js +41 -0
  32. package/generator/src/dev-server.js +36 -56
  33. package/generator/src/elm-codegen.js +3 -0
  34. package/generator/src/generate-template-module-connector.js +0 -28
  35. package/generator/src/pre-render-html.js +31 -17
  36. package/generator/src/render-worker.js +1 -1
  37. package/generator/src/render.js +224 -37
  38. package/generator/src/request-cache.js +1 -0
  39. package/generator/src/rewrite-elm-json.js +3 -3
  40. package/generator/src/seo-renderer.js +11 -4
  41. package/generator/src/vite-utils.js +78 -0
  42. package/generator/template/app/Api.elm +1 -1
  43. package/generator/template/app/Site.elm +6 -1
  44. package/package.json +12 -13
  45. package/src/ApiRoute.elm +146 -11
  46. package/src/DataSource/Env.elm +27 -3
  47. package/src/DataSource/File.elm +1 -1
  48. package/src/DataSource/Internal/Request.elm +0 -5
  49. package/src/DataSource.elm +50 -53
  50. package/src/Form/Field.elm +1 -1
  51. package/src/Form.elm +33 -33
  52. package/src/Head/Seo.elm +16 -27
  53. package/src/Head.elm +237 -7
  54. package/src/HtmlPrinter.elm +7 -3
  55. package/src/MultiDict.elm +49 -0
  56. package/src/Pages/Generate.elm +548 -103
  57. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  58. package/src/Pages/Internal/NotFoundReason.elm +3 -2
  59. package/src/Pages/Internal/Platform/Cli.elm +91 -27
  60. package/src/Pages/Internal/Platform/Cli.elm.bak +1276 -0
  61. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  62. package/src/Pages/Internal/Platform/GeneratorApplication.elm +455 -0
  63. package/src/Pages/Internal/Platform.elm +34 -27
  64. package/src/Pages/Manifest.elm +24 -0
  65. package/src/Pages/ProgramConfig.elm +6 -3
  66. package/src/Pages/Script.elm +100 -0
  67. package/src/PairingHeap.elm +137 -0
  68. package/src/Parser/Extra/String.elm +33 -0
  69. package/src/Parser/Extra.elm +69 -0
  70. package/src/ProgramTest/ComplexQuery.elm +360 -0
  71. package/src/ProgramTest/EffectSimulation.elm +122 -0
  72. package/src/ProgramTest/Failure.elm +367 -0
  73. package/src/ProgramTest/HtmlHighlighter.elm +116 -0
  74. package/src/ProgramTest/HtmlParserHacks.elm +58 -0
  75. package/src/ProgramTest/HtmlRenderer.elm +73 -0
  76. package/src/ProgramTest/Program.elm +30 -0
  77. package/src/ProgramTest/StringLines.elm +26 -0
  78. package/src/ProgramTest/TestHtmlHacks.elm +132 -0
  79. package/src/ProgramTest/TestHtmlParser.elm +201 -0
  80. package/src/ProgramTest.elm +2339 -0
  81. package/src/Query/Extra.elm +55 -0
  82. package/src/Result/Extra.elm +21 -0
  83. package/src/Server/Request.elm +2 -2
  84. package/src/Server/Session.elm +149 -83
  85. package/src/Server/SetCookie.elm +89 -31
  86. package/src/SimulatedEffect/Cmd.elm +69 -0
  87. package/src/SimulatedEffect/Http.elm +330 -0
  88. package/src/SimulatedEffect/Navigation.elm +69 -0
  89. package/src/SimulatedEffect/Ports.elm +62 -0
  90. package/src/SimulatedEffect/Process.elm +24 -0
  91. package/src/SimulatedEffect/Sub.elm +48 -0
  92. package/src/SimulatedEffect/Task.elm +252 -0
  93. package/src/SimulatedEffect/Time.elm +25 -0
  94. package/src/SimulatedEffect.elm +42 -0
  95. package/src/String/Extra.elm +6 -0
  96. package/src/Test/Http.elm +145 -0
  97. package/src/TestResult.elm +35 -0
  98. package/src/TestState.elm +305 -0
  99. package/src/Url/Extra.elm +100 -0
  100. package/src/Vendored/Diff.elm +321 -0
  101. package/src/Vendored/Failure.elm +217 -0
  102. package/src/Vendored/FormatMonochrome.elm +44 -0
  103. package/src/Vendored/Highlightable.elm +53 -0
@@ -0,0 +1,73 @@
1
+ module ProgramTest.HtmlRenderer exposing (render)
2
+
3
+ import ProgramTest.HtmlHighlighter as HtmlHighlighter exposing (Node(..))
4
+
5
+
6
+ render : (String -> String) -> Int -> List HtmlHighlighter.Node -> String
7
+ render colorHidden indent nodes =
8
+ case nodes of
9
+ [] ->
10
+ ""
11
+
12
+ (Text text) :: rest ->
13
+ case String.trim (String.replace "\n" " " text) of
14
+ "" ->
15
+ render colorHidden indent rest
16
+
17
+ trimmed ->
18
+ String.repeat indent " " ++ trimmed ++ "\n" ++ render colorHidden indent rest
19
+
20
+ (Comment text) :: rest ->
21
+ String.repeat indent " " ++ "<!--" ++ text ++ "-->\n" ++ render colorHidden indent rest
22
+
23
+ (Element tag attrs []) :: rest ->
24
+ String.repeat indent " "
25
+ ++ "<"
26
+ ++ tag
27
+ ++ renderAttrs attrs
28
+ ++ "></"
29
+ ++ tag
30
+ ++ ">\n"
31
+ ++ render colorHidden indent rest
32
+
33
+ (Element tag attrs children) :: rest ->
34
+ String.repeat indent " "
35
+ ++ "<"
36
+ ++ tag
37
+ ++ renderAttrs attrs
38
+ ++ ">\n"
39
+ ++ render colorHidden (indent + 4) children
40
+ ++ String.repeat indent " "
41
+ ++ "</"
42
+ ++ tag
43
+ ++ ">\n"
44
+ ++ render colorHidden indent rest
45
+
46
+ (Hidden short) :: rest ->
47
+ String.repeat indent " " ++ colorHidden short ++ "\n" ++ render colorHidden indent rest
48
+
49
+
50
+ renderAttrs : List HtmlHighlighter.Attribute -> String
51
+ renderAttrs attrs =
52
+ case attrs of
53
+ [] ->
54
+ ""
55
+
56
+ some ->
57
+ " " ++ String.join " " (List.map renderAttr some)
58
+
59
+
60
+ renderAttr : ( String, String ) -> String
61
+ renderAttr ( name, value ) =
62
+ case ( name, value ) of
63
+ ( "htmlfor", _ ) ->
64
+ "for=\"" ++ value ++ "\""
65
+
66
+ ( _, "true" ) ->
67
+ name ++ "=true"
68
+
69
+ ( _, "false" ) ->
70
+ name ++ "=false"
71
+
72
+ _ ->
73
+ name ++ "=\"" ++ value ++ "\""
@@ -0,0 +1,30 @@
1
+ module ProgramTest.Program exposing (Program, renderView)
2
+
3
+ import Browser
4
+ import Html exposing (Html)
5
+ import Test.Html.Query as Query
6
+ import Url exposing (Url)
7
+
8
+
9
+ {-| Since we can't inspect `Platform.Program`s in Elm,
10
+ this type represents the same thing as a record that we can access.
11
+
12
+ Note that we also parameterize `effect` and `sub` separately because
13
+ `Platform.Cmd` and `Platform.Sub` are not inspectable in Elm.
14
+
15
+ -}
16
+ type alias Program model msg effect sub =
17
+ { update : msg -> model -> ( model, effect )
18
+ , view : model -> Html msg
19
+ , onUrlRequest : Maybe (Browser.UrlRequest -> msg)
20
+ , onUrlChange : Maybe (Url -> msg)
21
+ , subscriptions : Maybe (model -> sub)
22
+ , withinFocus : Query.Single msg -> Query.Single msg
23
+ }
24
+
25
+
26
+ renderView : Program model msg effect sub -> model -> Query.Single msg
27
+ renderView program model =
28
+ program.view model
29
+ |> Query.fromHtml
30
+ |> program.withinFocus
@@ -0,0 +1,26 @@
1
+ module ProgramTest.StringLines exposing (charAt, replaceAt)
2
+
3
+
4
+ charAt : Int -> Int -> String -> Maybe String
5
+ charAt row col input =
6
+ String.lines input
7
+ |> List.drop (row - 1)
8
+ |> List.head
9
+ |> Maybe.map
10
+ (String.dropLeft (col - 1)
11
+ >> String.left 1
12
+ )
13
+
14
+
15
+ replaceAt : Int -> Int -> String -> String -> String
16
+ replaceAt row col replacement input =
17
+ String.lines input
18
+ |> List.indexedMap
19
+ (\i line ->
20
+ if i == (row - 1) then
21
+ String.left (col - 1) line ++ replacement ++ String.dropLeft col line
22
+
23
+ else
24
+ line
25
+ )
26
+ |> String.join "\n"
@@ -0,0 +1,132 @@
1
+ module ProgramTest.TestHtmlHacks exposing (getPassingSelectors, parseFailureReport, parseFailureReportWithoutHtml, parseSimulateFailure, renderHtml)
2
+
3
+ import Html.Parser
4
+ import Parser
5
+ import Parser.Extra
6
+ import ProgramTest.HtmlHighlighter as HtmlHighlighter
7
+ import ProgramTest.HtmlRenderer as HtmlRenderer
8
+ import ProgramTest.TestHtmlParser as TestHtmlParser exposing (Assertion(..), FailureReport(..))
9
+ import Test.Html.Query as Query
10
+ import Test.Html.Selector as Selector exposing (Selector)
11
+ import Test.Runner
12
+
13
+
14
+ pleaseReport description =
15
+ "PLEASE REPORT THIS AT <https://github.com/avh4/elm-program-test/issues>: " ++ description
16
+
17
+
18
+ renderHtml : (String -> String) -> (String -> List Html.Parser.Attribute -> List Html.Parser.Node -> Bool) -> Query.Single any -> String
19
+ renderHtml colorHidden highlightPredicate single =
20
+ case forceFailureReport [] single of
21
+ Ok (QueryFailure node _ _) ->
22
+ let
23
+ tryHighlight =
24
+ HtmlHighlighter.highlight highlightPredicate
25
+ node
26
+
27
+ finalHighlighted =
28
+ if HtmlHighlighter.isNonHiddenElement tryHighlight then
29
+ tryHighlight
30
+
31
+ else
32
+ HtmlHighlighter.highlight (\_ _ _ -> True)
33
+ node
34
+ in
35
+ "▼ Query.fromHtml\n\n"
36
+ ++ HtmlRenderer.render colorHidden 4 [ finalHighlighted ]
37
+
38
+ Ok (EventFailure name _) ->
39
+ pleaseReport ("renderHtml: unexpected EventFailure: \"" ++ name ++ "\"")
40
+
41
+ Err err ->
42
+ pleaseReport ("renderHtml: couldn't parse failure report: " ++ err)
43
+
44
+
45
+ getPassingSelectors : List Selector -> Query.Single msg -> List String
46
+ getPassingSelectors selectors single =
47
+ case forceFailureReportWithoutHtml selectors single of
48
+ Ok (QueryFailure _ _ (Has _ results)) ->
49
+ case List.reverse results of
50
+ (Ok _) :: _ ->
51
+ [ pleaseReport "getPassingSelectors: forced selector didn't fail" ]
52
+
53
+ _ ->
54
+ List.filterMap Result.toMaybe results
55
+
56
+ Ok (EventFailure name _) ->
57
+ [ pleaseReport ("getPassingSelectors: got unexpected EventFailure \"" ++ name ++ "\"") ]
58
+
59
+ Err err ->
60
+ [ pleaseReport ("getPassingSelectors: couldn't parse failure report: " ++ err) ]
61
+
62
+
63
+ forceFailureReport : List Selector -> Query.Single any -> Result String (FailureReport Html.Parser.Node)
64
+ forceFailureReport selectors =
65
+ forceFailureReport_ parseFailureReport selectors "ProgramTest.TestHtmlHacks is trying to force a failure to collect the error message %%"
66
+
67
+
68
+ forceFailureReportWithoutHtml : List Selector -> Query.Single any -> Result String (FailureReport ())
69
+ forceFailureReportWithoutHtml selectors =
70
+ forceFailureReport_ parseFailureReportWithoutHtml selectors "ProgramTest.TestHtmlHacks is trying to force a failure to collect the error message %%"
71
+
72
+
73
+ forceFailureReport_ : (String -> result) -> List Selector -> String -> Query.Single any -> result
74
+ forceFailureReport_ parseFailure selectors unique single =
75
+ case
76
+ single
77
+ |> Query.has (selectors ++ [ Selector.text unique ])
78
+ |> Test.Runner.getFailureReason
79
+ of
80
+ Nothing ->
81
+ -- We expect the fake query to fail -- if it doesn't for some reason, just try recursing with a different fake matching string until it does fail
82
+ forceFailureReport_ parseFailure selectors (unique ++ "_") single
83
+
84
+ Just reason ->
85
+ parseFailure reason.description
86
+
87
+
88
+ parseFailureReport : String -> Result String (FailureReport Html.Parser.Node)
89
+ parseFailureReport string =
90
+ Parser.run TestHtmlParser.parser string
91
+ |> Result.mapError Parser.Extra.deadEndsToString
92
+
93
+
94
+ parseFailureReportWithoutHtml : String -> Result String (FailureReport ())
95
+ parseFailureReportWithoutHtml string =
96
+ Parser.run TestHtmlParser.parserWithoutHtml string
97
+ |> Result.mapError Parser.Extra.deadEndsToString
98
+
99
+
100
+ partitionSections_ : List String -> List (List String) -> List String -> List (List String)
101
+ partitionSections_ accLines accSections remaining =
102
+ case remaining of
103
+ [] ->
104
+ case List.reverse (List.reverse accLines :: accSections) of
105
+ [] :: rest ->
106
+ rest
107
+
108
+ all ->
109
+ all
110
+
111
+ next :: rest ->
112
+ if String.startsWith "▼ " next then
113
+ partitionSections_ [ next ] (List.reverse accLines :: accSections) rest
114
+
115
+ else
116
+ partitionSections_ (next :: accLines) accSections rest
117
+
118
+
119
+ parseSimulateFailure : String -> String
120
+ parseSimulateFailure string =
121
+ let
122
+ simpleFailure result =
123
+ case result of
124
+ EventFailure name html ->
125
+ Ok ("Event.expectEvent: I found a node, but it does not listen for \"" ++ name ++ "\" events like I expected it would.")
126
+
127
+ _ ->
128
+ Err (pleaseReport "Got a failure message from Test.Html.Query that we couldn't parse: " ++ string)
129
+ in
130
+ parseFailureReport string
131
+ |> Result.andThen simpleFailure
132
+ |> Result.withDefault (pleaseReport "Got a failure message from Test.Html.Query that we couldn't parse: " ++ string)
@@ -0,0 +1,201 @@
1
+ module ProgramTest.TestHtmlParser exposing (Assertion(..), FailureReport(..), Selector(..), Step(..), parser, parserWithoutHtml)
2
+
3
+ import Html.Parser
4
+ import Parser exposing ((|.), (|=), Parser)
5
+ import Parser.Extra.String
6
+ import ProgramTest.HtmlParserHacks as HtmlParserHacks
7
+
8
+
9
+ type FailureReport html
10
+ = QueryFailure html (List (Step html)) Assertion
11
+ | EventFailure String html
12
+
13
+
14
+ type Step html
15
+ = FindStep (List Selector) html
16
+
17
+
18
+ type Selector
19
+ = Tag String
20
+ | Containing (List Selector)
21
+ | Text String
22
+ | Attribute String String
23
+ | All (List Selector)
24
+
25
+
26
+ type Assertion
27
+ = Has (List Selector) (List (Result String String))
28
+
29
+
30
+ parser_ : Parser html -> Parser (FailureReport html)
31
+ parser_ parseHtml =
32
+ Parser.oneOf
33
+ [ Parser.succeed QueryFailure
34
+ |. Parser.keyword "▼ Query.fromHtml"
35
+ |. Parser.symbol "\n\n "
36
+ |= parseHtml
37
+ |= stepsParser parseHtml
38
+ |= assertionParser
39
+ |. Parser.end
40
+ , Parser.succeed EventFailure
41
+ |. Parser.keyword "Event.expectEvent:"
42
+ |. Parser.symbol " I found a node, but it does not listen for \""
43
+ |= (Parser.getChompedString <| Parser.chompUntil "\"")
44
+ |. Parser.symbol "\" events like I expected it would.\n\n"
45
+ |= parseHtml
46
+ |. Parser.end
47
+ ]
48
+
49
+
50
+ parser : Parser (FailureReport Html.Parser.Node)
51
+ parser =
52
+ parser_ trimmedHtml
53
+
54
+
55
+ trimmedHtml : Parser Html.Parser.Node
56
+ trimmedHtml =
57
+ Parser.map HtmlParserHacks.trimText Html.Parser.node
58
+ |. Parser.oneOf
59
+ [ Parser.symbol "\n\n\n"
60
+ , Parser.end
61
+ ]
62
+
63
+
64
+ parserWithoutHtml : Parser (FailureReport ())
65
+ parserWithoutHtml =
66
+ parser_ ignoreHtml
67
+
68
+
69
+ ignoreHtml : Parser ()
70
+ ignoreHtml =
71
+ Parser.chompUntilEndOr "▼"
72
+
73
+
74
+ stepsParser : Parser html -> Parser (List (Step html))
75
+ stepsParser parseHtml =
76
+ Parser.loop [] <|
77
+ \acc ->
78
+ Parser.oneOf
79
+ [ Parser.succeed (\stmt -> Parser.Loop (stmt :: acc))
80
+ |= stepParser parseHtml
81
+ , Parser.succeed ()
82
+ |> Parser.map (\_ -> Parser.Done (List.reverse acc))
83
+ ]
84
+
85
+
86
+ stepParser : Parser html -> Parser (Step html)
87
+ stepParser parseHtml =
88
+ Parser.oneOf
89
+ [ Parser.succeed FindStep
90
+ |. Parser.keyword "▼ Query.find "
91
+ |= selectorsParser
92
+ |. Parser.symbol "\n\n 1) "
93
+ |= parseHtml
94
+ ]
95
+
96
+
97
+ selectorsParser : Parser (List Selector)
98
+ selectorsParser =
99
+ Parser.sequence
100
+ { start = "[ "
101
+ , separator = ", "
102
+ , end = " ]"
103
+ , spaces = Parser.succeed ()
104
+ , item = selectorParser
105
+ , trailing = Parser.Forbidden
106
+ }
107
+
108
+
109
+ selectorParser : Parser Selector
110
+ selectorParser =
111
+ -- As of elm-explorations/test 1.2.2, `Selector.all` renders simply as a space-separated sequence of selectors
112
+ let
113
+ done acc =
114
+ case acc of
115
+ [ single ] ->
116
+ single
117
+
118
+ more ->
119
+ All (List.reverse more)
120
+ in
121
+ singleSelectorParser
122
+ |> Parser.andThen
123
+ (\first ->
124
+ Parser.loop [ first ] <|
125
+ \acc ->
126
+ Parser.oneOf
127
+ [ Parser.succeed (\stmt -> Parser.Loop (stmt :: acc))
128
+ |. Parser.backtrackable (Parser.symbol " ")
129
+ |= singleSelectorParser
130
+ , Parser.succeed ()
131
+ |> Parser.map (\_ -> Parser.Done (done acc))
132
+ ]
133
+ )
134
+
135
+
136
+ singleSelectorParser : Parser Selector
137
+ singleSelectorParser =
138
+ Parser.oneOf
139
+ [ Parser.succeed Tag
140
+ |. Parser.keyword "tag "
141
+ |= Parser.Extra.String.string
142
+ , Parser.succeed Text
143
+ |. Parser.keyword "text "
144
+ |= Parser.Extra.String.string
145
+ , Parser.succeed Attribute
146
+ |. Parser.keyword "attribute "
147
+ |= Parser.Extra.String.string
148
+ |. Parser.symbol " "
149
+ |= Parser.oneOf
150
+ [ Parser.Extra.String.string
151
+ , Parser.succeed "true"
152
+ |. Parser.keyword "True"
153
+ , Parser.succeed "false"
154
+ |. Parser.keyword "False"
155
+ ]
156
+ , Parser.succeed Containing
157
+ |. Parser.keyword "containing "
158
+ |= Parser.lazy (\() -> selectorsParser)
159
+ |. Parser.symbol " "
160
+ ]
161
+
162
+
163
+ assertionParser : Parser Assertion
164
+ assertionParser =
165
+ Parser.oneOf
166
+ [ Parser.succeed Has
167
+ |. Parser.keyword "▼ Query.has "
168
+ |= selectorsParser
169
+ |. Parser.symbol "\n\n"
170
+ |= selectorResultsParser
171
+ ]
172
+
173
+
174
+ selectorResultsParser : Parser (List (Result String String))
175
+ selectorResultsParser =
176
+ let
177
+ help acc =
178
+ Parser.oneOf
179
+ [ Parser.succeed (\stmt -> Parser.Loop (stmt :: acc))
180
+ |= selectorResultParser
181
+ , Parser.succeed ()
182
+ |> Parser.map (\_ -> Parser.Done (List.reverse acc))
183
+ ]
184
+ in
185
+ Parser.loop [] help
186
+
187
+
188
+ selectorResultParser : Parser (Result String String)
189
+ selectorResultParser =
190
+ Parser.oneOf
191
+ [ Parser.succeed (Ok << String.trim)
192
+ |. Parser.symbol "✓ "
193
+ |. Parser.commit ()
194
+ |= (Parser.getChompedString <| Parser.chompUntilEndOr "\n")
195
+ |. Parser.chompWhile ((==) '\n')
196
+ , Parser.succeed (Err << String.trim)
197
+ |. Parser.symbol "✗ "
198
+ |. Parser.commit ()
199
+ |= (Parser.getChompedString <| Parser.chompUntilEndOr "\n")
200
+ |. Parser.chompWhile ((==) '\n')
201
+ ]