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.
- package/README.md +10 -1
- package/codegen/elm-pages-codegen.js +803 -284
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1326 -121
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +15368 -13272
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +1 -1
- package/generator/dead-code-review/elm.json +6 -5
- package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +141 -17
- package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +218 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
- package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1326 -121
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +14574 -12631
- package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
- package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +1 -1
- package/generator/review/elm.json +6 -6
- package/generator/src/SharedTemplate.elm +1 -1
- package/generator/src/build.js +81 -51
- package/generator/src/cli.js +120 -42
- package/generator/src/codegen.js +11 -10
- package/generator/src/compatibility-key.js +1 -0
- package/generator/src/config.js +41 -0
- package/generator/src/dev-server.js +36 -56
- package/generator/src/elm-codegen.js +3 -0
- package/generator/src/generate-template-module-connector.js +0 -28
- package/generator/src/pre-render-html.js +31 -17
- package/generator/src/render-worker.js +1 -1
- package/generator/src/render.js +224 -37
- package/generator/src/request-cache.js +1 -0
- package/generator/src/rewrite-elm-json.js +3 -3
- package/generator/src/seo-renderer.js +11 -4
- package/generator/src/vite-utils.js +78 -0
- package/generator/template/app/Api.elm +1 -1
- package/generator/template/app/Site.elm +6 -1
- package/package.json +12 -13
- package/src/ApiRoute.elm +146 -11
- package/src/DataSource/Env.elm +27 -3
- package/src/DataSource/File.elm +1 -1
- package/src/DataSource/Internal/Request.elm +0 -5
- package/src/DataSource.elm +50 -53
- package/src/Form/Field.elm +1 -1
- package/src/Form.elm +33 -33
- package/src/Head/Seo.elm +16 -27
- package/src/Head.elm +237 -7
- package/src/HtmlPrinter.elm +7 -3
- package/src/MultiDict.elm +49 -0
- package/src/Pages/Generate.elm +548 -103
- package/src/Pages/GeneratorProgramConfig.elm +15 -0
- package/src/Pages/Internal/NotFoundReason.elm +3 -2
- package/src/Pages/Internal/Platform/Cli.elm +91 -27
- package/src/Pages/Internal/Platform/Cli.elm.bak +1276 -0
- package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
- package/src/Pages/Internal/Platform/GeneratorApplication.elm +455 -0
- package/src/Pages/Internal/Platform.elm +34 -27
- package/src/Pages/Manifest.elm +24 -0
- package/src/Pages/ProgramConfig.elm +6 -3
- package/src/Pages/Script.elm +100 -0
- package/src/PairingHeap.elm +137 -0
- package/src/Parser/Extra/String.elm +33 -0
- package/src/Parser/Extra.elm +69 -0
- package/src/ProgramTest/ComplexQuery.elm +360 -0
- package/src/ProgramTest/EffectSimulation.elm +122 -0
- package/src/ProgramTest/Failure.elm +367 -0
- package/src/ProgramTest/HtmlHighlighter.elm +116 -0
- package/src/ProgramTest/HtmlParserHacks.elm +58 -0
- package/src/ProgramTest/HtmlRenderer.elm +73 -0
- package/src/ProgramTest/Program.elm +30 -0
- package/src/ProgramTest/StringLines.elm +26 -0
- package/src/ProgramTest/TestHtmlHacks.elm +132 -0
- package/src/ProgramTest/TestHtmlParser.elm +201 -0
- package/src/ProgramTest.elm +2339 -0
- package/src/Query/Extra.elm +55 -0
- package/src/Result/Extra.elm +21 -0
- package/src/Server/Request.elm +2 -2
- package/src/Server/Session.elm +149 -83
- package/src/Server/SetCookie.elm +89 -31
- package/src/SimulatedEffect/Cmd.elm +69 -0
- package/src/SimulatedEffect/Http.elm +330 -0
- package/src/SimulatedEffect/Navigation.elm +69 -0
- package/src/SimulatedEffect/Ports.elm +62 -0
- package/src/SimulatedEffect/Process.elm +24 -0
- package/src/SimulatedEffect/Sub.elm +48 -0
- package/src/SimulatedEffect/Task.elm +252 -0
- package/src/SimulatedEffect/Time.elm +25 -0
- package/src/SimulatedEffect.elm +42 -0
- package/src/String/Extra.elm +6 -0
- package/src/Test/Http.elm +145 -0
- package/src/TestResult.elm +35 -0
- package/src/TestState.elm +305 -0
- package/src/Url/Extra.elm +100 -0
- package/src/Vendored/Diff.elm +321 -0
- package/src/Vendored/Failure.elm +217 -0
- package/src/Vendored/FormatMonochrome.elm +44 -0
- 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
|
+
]
|