elm-pages 3.0.0-beta.2 → 3.0.0-beta.20
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 → elm-pages-codegen.cjs} +2420 -1592
- 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 +15215 -13007
- 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 +8 -6
- package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +189 -17
- package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +255 -21
- 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 +14620 -12636
- 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 +8 -8
- package/generator/src/RouteBuilder.elm +66 -52
- package/generator/src/SharedTemplate.elm +3 -2
- package/generator/src/SiteConfig.elm +3 -2
- package/generator/src/basepath-middleware.js +3 -3
- package/generator/src/build.js +122 -86
- package/generator/src/cli.js +247 -51
- package/generator/src/codegen.js +29 -27
- package/generator/src/compatibility-key.js +1 -0
- package/generator/src/compile-elm.js +20 -22
- package/generator/src/config.js +39 -0
- package/generator/src/copy-dir.js +2 -2
- package/generator/src/dev-server.js +119 -110
- package/generator/src/dir-helpers.js +9 -26
- package/generator/src/elm-codegen.js +5 -4
- package/generator/src/elm-file-constants.js +2 -3
- package/generator/src/error-formatter.js +12 -11
- package/generator/src/file-helpers.js +3 -4
- package/generator/src/generate-template-module-connector.js +14 -21
- package/generator/src/init.js +8 -7
- package/generator/src/pre-render-html.js +41 -28
- package/generator/src/render-test.js +109 -0
- package/generator/src/render-worker.js +26 -28
- package/generator/src/render.js +322 -142
- package/generator/src/request-cache.js +200 -162
- package/generator/src/rewrite-client-elm-json.js +5 -5
- package/generator/src/rewrite-elm-json.js +7 -7
- package/generator/src/route-codegen-helpers.js +16 -31
- package/generator/src/seo-renderer.js +12 -7
- package/generator/src/vite-utils.js +77 -0
- package/generator/static-code/hmr.js +16 -2
- package/generator/template/app/Api.elm +3 -3
- package/generator/template/app/Route/Index.elm +3 -3
- package/generator/template/app/Shared.elm +3 -3
- package/generator/template/app/Site.elm +9 -4
- package/package.json +21 -21
- package/src/ApiRoute.elm +199 -61
- package/src/BackendTask/Custom.elm +214 -0
- package/src/BackendTask/Env.elm +90 -0
- package/src/{DataSource → BackendTask}/File.elm +128 -43
- package/src/{DataSource → BackendTask}/Glob.elm +136 -125
- package/src/BackendTask/Http.elm +673 -0
- package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
- package/src/BackendTask/Internal/Request.elm +28 -0
- package/src/BackendTask/Random.elm +79 -0
- package/src/BackendTask/Time.elm +47 -0
- package/src/BackendTask.elm +537 -0
- package/src/FatalError.elm +89 -0
- package/src/Form/Field.elm +1 -1
- package/src/Form.elm +72 -92
- package/src/Head/Seo.elm +4 -4
- package/src/Head.elm +237 -7
- package/src/HtmlPrinter.elm +7 -3
- package/src/Internal/ApiRoute.elm +7 -5
- package/src/PageServerResponse.elm +6 -1
- package/src/Pages/Generate.elm +775 -132
- package/src/Pages/GeneratorProgramConfig.elm +15 -0
- package/src/Pages/Internal/FatalError.elm +5 -0
- package/src/Pages/Internal/Form.elm +21 -1
- package/src/Pages/Internal/Platform/Cli.elm +479 -747
- package/src/Pages/Internal/Platform/Cli.elm.bak +1276 -0
- package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
- package/src/Pages/Internal/Platform/Effect.elm +1 -2
- package/src/Pages/Internal/Platform/GeneratorApplication.elm +373 -0
- package/src/Pages/Internal/Platform/StaticResponses.elm +73 -270
- package/src/Pages/Internal/Platform/ToJsPayload.elm +4 -7
- package/src/Pages/Internal/Platform.elm +54 -53
- package/src/Pages/Internal/Script.elm +17 -0
- package/src/Pages/Internal/StaticHttpBody.elm +35 -1
- package/src/Pages/Manifest.elm +29 -4
- package/src/Pages/ProgramConfig.elm +12 -8
- package/src/Pages/Script.elm +109 -0
- package/src/Pages/SiteConfig.elm +3 -2
- package/src/Pages/StaticHttp/Request.elm +2 -2
- package/src/Pages/StaticHttpRequest.elm +23 -98
- package/src/RequestsAndPending.elm +8 -19
- package/src/Result/Extra.elm +21 -0
- package/src/Server/Request.elm +43 -34
- package/src/Server/Session.elm +166 -100
- package/src/Server/SetCookie.elm +89 -31
- package/src/DataSource/Env.elm +0 -38
- package/src/DataSource/Http.elm +0 -446
- package/src/DataSource/Internal/Request.elm +0 -20
- package/src/DataSource/Port.elm +0 -90
- package/src/DataSource.elm +0 -538
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve,
|
|
1
|
+
module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve, toBuildError)
|
|
2
2
|
|
|
3
3
|
import BuildError exposing (BuildError)
|
|
4
4
|
import Dict
|
|
5
|
-
import
|
|
5
|
+
import Json.Encode
|
|
6
6
|
import Pages.StaticHttp.Request
|
|
7
7
|
import RequestsAndPending exposing (RequestsAndPending)
|
|
8
8
|
import TerminalText as Terminal
|
|
@@ -13,30 +13,19 @@ type alias MockResolver =
|
|
|
13
13
|
-> Maybe RequestsAndPending.Response
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
type RawRequest value
|
|
17
|
-
= Request (List Pages.StaticHttp.Request.Request) (Maybe MockResolver -> RequestsAndPending -> RawRequest value)
|
|
18
|
-
|
|
|
19
|
-
| ApiRoute value
|
|
16
|
+
type RawRequest error value
|
|
17
|
+
= Request (List Pages.StaticHttp.Request.Request) (Maybe MockResolver -> RequestsAndPending -> RawRequest error value)
|
|
18
|
+
| ApiRoute (Result error value)
|
|
20
19
|
|
|
21
20
|
|
|
22
21
|
type Error
|
|
23
|
-
=
|
|
24
|
-
| DecoderError String
|
|
22
|
+
= DecoderError String
|
|
25
23
|
| UserCalledStaticHttpFail String
|
|
26
24
|
|
|
27
25
|
|
|
28
26
|
toBuildError : String -> Error -> BuildError
|
|
29
27
|
toBuildError path error =
|
|
30
28
|
case error of
|
|
31
|
-
MissingHttpResponse missingKey _ ->
|
|
32
|
-
{ title = "Missing Http Response"
|
|
33
|
-
, message =
|
|
34
|
-
[ Terminal.text missingKey
|
|
35
|
-
]
|
|
36
|
-
, path = path
|
|
37
|
-
, fatal = True
|
|
38
|
-
}
|
|
39
|
-
|
|
40
29
|
DecoderError decodeErrorMessage ->
|
|
41
30
|
{ title = "Static Http Decoding Error"
|
|
42
31
|
, message =
|
|
@@ -49,107 +38,43 @@ toBuildError path error =
|
|
|
49
38
|
UserCalledStaticHttpFail decodeErrorMessage ->
|
|
50
39
|
{ title = "Called Static Http Fail"
|
|
51
40
|
, message =
|
|
52
|
-
[ Terminal.text <| "I ran into a call to `
|
|
41
|
+
[ Terminal.text <| "I ran into a call to `BackendTask.fail` with message: " ++ decodeErrorMessage
|
|
53
42
|
]
|
|
54
43
|
, path = path
|
|
55
44
|
, fatal = True
|
|
56
45
|
}
|
|
57
46
|
|
|
58
47
|
|
|
59
|
-
|
|
60
|
-
resolve request rawResponses =
|
|
61
|
-
case request of
|
|
62
|
-
RequestError error ->
|
|
63
|
-
Err error
|
|
64
|
-
|
|
65
|
-
Request _ lookupFn ->
|
|
66
|
-
case lookupFn Nothing rawResponses of
|
|
67
|
-
nextRequest ->
|
|
68
|
-
resolve nextRequest rawResponses
|
|
69
|
-
|
|
70
|
-
ApiRoute value ->
|
|
71
|
-
Ok value
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
mockResolve : RawRequest value -> MockResolver -> Result Error value
|
|
48
|
+
mockResolve : RawRequest error value -> MockResolver -> Result error value
|
|
75
49
|
mockResolve request mockResolver =
|
|
76
50
|
case request of
|
|
77
|
-
RequestError error ->
|
|
78
|
-
Err error
|
|
79
|
-
|
|
80
51
|
Request _ lookupFn ->
|
|
81
|
-
case lookupFn (Just mockResolver)
|
|
52
|
+
case lookupFn (Just mockResolver) (Json.Encode.object []) of
|
|
82
53
|
nextRequest ->
|
|
83
54
|
mockResolve nextRequest mockResolver
|
|
84
55
|
|
|
85
56
|
ApiRoute value ->
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
resolveUrls : RawRequest value -> RequestsAndPending -> List Pages.StaticHttp.Request.Request
|
|
90
|
-
resolveUrls request rawResponses =
|
|
91
|
-
resolveUrlsHelp rawResponses [] request
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
resolveUrlsHelp : RequestsAndPending -> List Pages.StaticHttp.Request.Request -> RawRequest value -> List Pages.StaticHttp.Request.Request
|
|
95
|
-
resolveUrlsHelp rawResponses soFar request =
|
|
96
|
-
case request of
|
|
97
|
-
RequestError error ->
|
|
98
|
-
case error of
|
|
99
|
-
MissingHttpResponse _ next ->
|
|
100
|
-
(soFar ++ next)
|
|
101
|
-
|> List.Extra.uniqueBy Pages.StaticHttp.Request.hash
|
|
102
|
-
|
|
103
|
-
_ ->
|
|
104
|
-
soFar
|
|
105
|
-
|
|
106
|
-
Request urlList lookupFn ->
|
|
107
|
-
resolveUrlsHelp
|
|
108
|
-
rawResponses
|
|
109
|
-
(soFar ++ urlList)
|
|
110
|
-
(lookupFn Nothing rawResponses)
|
|
111
|
-
|
|
112
|
-
ApiRoute _ ->
|
|
113
|
-
soFar
|
|
57
|
+
value
|
|
114
58
|
|
|
115
59
|
|
|
116
60
|
cacheRequestResolution :
|
|
117
|
-
RawRequest value
|
|
61
|
+
RawRequest error value
|
|
118
62
|
-> RequestsAndPending
|
|
119
|
-
-> Status value
|
|
63
|
+
-> Status error value
|
|
120
64
|
cacheRequestResolution request rawResponses =
|
|
121
|
-
cacheRequestResolutionHelp [] rawResponses request
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
type Status value
|
|
125
|
-
= Incomplete (List Pages.StaticHttp.Request.Request)
|
|
126
|
-
| HasPermanentError Error
|
|
127
|
-
| Complete
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
cacheRequestResolutionHelp :
|
|
131
|
-
List Pages.StaticHttp.Request.Request
|
|
132
|
-
-> RequestsAndPending
|
|
133
|
-
-> RawRequest value
|
|
134
|
-
-> Status value
|
|
135
|
-
cacheRequestResolutionHelp foundUrls rawResponses request =
|
|
136
65
|
case request of
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
-- TODO do I need to pass through continuation URLs here? -- Incomplete (urlList ++ foundUrls)
|
|
141
|
-
Incomplete foundUrls
|
|
66
|
+
Request urlList lookupFn ->
|
|
67
|
+
if List.isEmpty urlList then
|
|
68
|
+
cacheRequestResolution (lookupFn Nothing rawResponses) rawResponses
|
|
142
69
|
|
|
143
|
-
|
|
144
|
-
|
|
70
|
+
else
|
|
71
|
+
Incomplete urlList (Request [] lookupFn)
|
|
145
72
|
|
|
146
|
-
|
|
147
|
-
|
|
73
|
+
ApiRoute value ->
|
|
74
|
+
Complete value
|
|
148
75
|
|
|
149
|
-
Request urlList lookupFn ->
|
|
150
|
-
cacheRequestResolutionHelp urlList
|
|
151
|
-
rawResponses
|
|
152
|
-
(lookupFn Nothing rawResponses)
|
|
153
76
|
|
|
154
|
-
|
|
155
|
-
|
|
77
|
+
type Status error value
|
|
78
|
+
= Incomplete (List Pages.StaticHttp.Request.Request) (RawRequest error value)
|
|
79
|
+
| HasPermanentError Error
|
|
80
|
+
| Complete (Result error value)
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
module RequestsAndPending exposing (RequestsAndPending, Response(..), ResponseBody(..),
|
|
1
|
+
module RequestsAndPending exposing (RawResponse, RequestsAndPending, Response(..), ResponseBody(..), bodyEncoder, get)
|
|
2
2
|
|
|
3
3
|
import Base64
|
|
4
4
|
import Bytes exposing (Bytes)
|
|
5
|
-
import Codec
|
|
6
5
|
import Dict exposing (Dict)
|
|
7
6
|
import Json.Decode as Decode exposing (Decoder)
|
|
8
7
|
import Json.Encode as Encode
|
|
9
|
-
import Pages.StaticHttp.Request
|
|
10
8
|
|
|
11
9
|
|
|
12
10
|
type alias RequestsAndPending =
|
|
13
|
-
|
|
11
|
+
Decode.Value
|
|
14
12
|
|
|
15
13
|
|
|
16
14
|
type ResponseBody
|
|
@@ -20,18 +18,6 @@ type ResponseBody
|
|
|
20
18
|
| WhateverBody
|
|
21
19
|
|
|
22
20
|
|
|
23
|
-
batchDecoder : Decoder (List { request : Pages.StaticHttp.Request.Request, response : Response })
|
|
24
|
-
batchDecoder =
|
|
25
|
-
Decode.map2 (\request response -> { request = request, response = response })
|
|
26
|
-
(Decode.field "request"
|
|
27
|
-
(Pages.StaticHttp.Request.codec
|
|
28
|
-
|> Codec.decoder
|
|
29
|
-
)
|
|
30
|
-
)
|
|
31
|
-
(Decode.field "response" decoder)
|
|
32
|
-
|> Decode.list
|
|
33
|
-
|
|
34
|
-
|
|
35
21
|
decoder : Decoder Response
|
|
36
22
|
decoder =
|
|
37
23
|
Decode.map2 Response
|
|
@@ -117,6 +103,9 @@ responseDecoder =
|
|
|
117
103
|
|
|
118
104
|
get : String -> RequestsAndPending -> Maybe Response
|
|
119
105
|
get key requestsAndPending =
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
106
|
+
Decode.decodeValue
|
|
107
|
+
(Decode.field key
|
|
108
|
+
(Decode.field "response" decoder)
|
|
109
|
+
)
|
|
110
|
+
requestsAndPending
|
|
111
|
+
|> Result.toMaybe
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Result.Extra exposing (isOk, merge)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
isOk : Result x a -> Bool
|
|
5
|
+
isOk result =
|
|
6
|
+
case result of
|
|
7
|
+
Ok _ ->
|
|
8
|
+
True
|
|
9
|
+
|
|
10
|
+
Err _ ->
|
|
11
|
+
False
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
merge : Result a a -> a
|
|
15
|
+
merge r =
|
|
16
|
+
case r of
|
|
17
|
+
Ok rr ->
|
|
18
|
+
rr
|
|
19
|
+
|
|
20
|
+
Err rr ->
|
|
21
|
+
rr
|
package/src/Server/Request.elm
CHANGED
|
@@ -86,11 +86,12 @@ module Server.Request exposing
|
|
|
86
86
|
|
|
87
87
|
-}
|
|
88
88
|
|
|
89
|
+
import BackendTask exposing (BackendTask)
|
|
89
90
|
import CookieParser
|
|
90
|
-
import DataSource exposing (DataSource)
|
|
91
91
|
import Dict exposing (Dict)
|
|
92
|
+
import FatalError exposing (FatalError)
|
|
92
93
|
import Form
|
|
93
|
-
import Form.Validation
|
|
94
|
+
import Form.Validation as Validation
|
|
94
95
|
import FormData
|
|
95
96
|
import Internal.Request
|
|
96
97
|
import Json.Decode
|
|
@@ -118,17 +119,17 @@ Note that this data is not available for pre-rendered pages or pre-rendered API
|
|
|
118
119
|
This is because when a page is pre-rendered, there _is_ no incoming HTTP request to respond to, it is rendered before a user
|
|
119
120
|
requests the page and then the pre-rendered page is served as a plain file (without running your Route Module).
|
|
120
121
|
|
|
121
|
-
That's why `RouteBuilder.preRender` has `data : RouteParams ->
|
|
122
|
+
That's why `RouteBuilder.preRender` has `data : RouteParams -> BackendTask Data`:
|
|
122
123
|
|
|
123
|
-
import
|
|
124
|
+
import BackendTask exposing (BackendTask)
|
|
124
125
|
import RouteBuilder exposing (StatelessRoute)
|
|
125
126
|
|
|
126
127
|
type alias Data =
|
|
127
128
|
{}
|
|
128
129
|
|
|
129
|
-
data : RouteParams ->
|
|
130
|
+
data : RouteParams -> BackendTask Data
|
|
130
131
|
data routeParams =
|
|
131
|
-
|
|
132
|
+
BackendTask.succeed Data
|
|
132
133
|
|
|
133
134
|
route : StatelessRoute RouteParams Data ActionData
|
|
134
135
|
route =
|
|
@@ -141,7 +142,7 @@ That's why `RouteBuilder.preRender` has `data : RouteParams -> DataSource Data`:
|
|
|
141
142
|
|
|
142
143
|
A server-rendered Route Module _does_ have access to a user's incoming HTTP request because it runs every time the page
|
|
143
144
|
is loaded. That's why `data` is a `Request.Parser` in server-rendered Route Modules. Since you have an incoming HTTP request for server-rendered routes,
|
|
144
|
-
`RouteBuilder.serverRender` has `data : RouteParams -> Request.Parser (
|
|
145
|
+
`RouteBuilder.serverRender` has `data : RouteParams -> Request.Parser (BackendTask (Response Data))`. That means that you
|
|
145
146
|
can use the incoming HTTP request data to choose how to respond. For example, you could check for a dark-mode preference
|
|
146
147
|
cookie and render a light- or dark-themed page and render a different page.
|
|
147
148
|
|
|
@@ -151,7 +152,7 @@ That's a mouthful, so let's unpack what it means.
|
|
|
151
152
|
|
|
152
153
|
data from the request payload using a Server Request Parser.
|
|
153
154
|
|
|
154
|
-
import
|
|
155
|
+
import BackendTask exposing (BackendTask)
|
|
155
156
|
import RouteBuilder exposing (StatelessRoute)
|
|
156
157
|
import Server.Request as Request exposing (Request)
|
|
157
158
|
import Server.Response as Response exposing (Response)
|
|
@@ -161,11 +162,11 @@ data from the request payload using a Server Request Parser.
|
|
|
161
162
|
|
|
162
163
|
data :
|
|
163
164
|
RouteParams
|
|
164
|
-
-> Request.Parser (
|
|
165
|
+
-> Request.Parser (BackendTask (Response Data))
|
|
165
166
|
data routeParams =
|
|
166
167
|
{}
|
|
167
168
|
|> Server.Response.render
|
|
168
|
-
|>
|
|
169
|
+
|> BackendTask.succeed
|
|
169
170
|
|> Request.succeed
|
|
170
171
|
|
|
171
172
|
route : StatelessRoute RouteParams Data ActionData
|
|
@@ -225,7 +226,7 @@ succeed value =
|
|
|
225
226
|
|
|
226
227
|
{-| TODO internal only
|
|
227
228
|
-}
|
|
228
|
-
getDecoder : Parser (
|
|
229
|
+
getDecoder : Parser (BackendTask error response) -> Json.Decode.Decoder (Result ( ValidationError, List ValidationError ) (BackendTask error response))
|
|
229
230
|
getDecoder (Internal.Request.Parser decoder) =
|
|
230
231
|
decoder
|
|
231
232
|
|> Json.Decode.map
|
|
@@ -881,8 +882,8 @@ fileField_ name =
|
|
|
881
882
|
|
|
882
883
|
{-| -}
|
|
883
884
|
formDataWithServerValidation :
|
|
884
|
-
Form.ServerForms error (
|
|
885
|
-
-> Parser (
|
|
885
|
+
Form.ServerForms error (BackendTask FatalError (Validation.Validation error combined kind constraints))
|
|
886
|
+
-> Parser (BackendTask FatalError (Result (Form.Response error) ( Form.Response error, combined )))
|
|
886
887
|
formDataWithServerValidation formParsers =
|
|
887
888
|
rawFormData
|
|
888
889
|
|> andThen
|
|
@@ -897,27 +898,25 @@ formDataWithServerValidation formParsers =
|
|
|
897
898
|
( Just decoded, Nothing ) ->
|
|
898
899
|
succeed
|
|
899
900
|
(decoded
|
|
900
|
-
|>
|
|
901
|
+
|> BackendTask.map
|
|
901
902
|
(\(Validation _ _ ( maybeParsed, errors2 )) ->
|
|
902
903
|
case ( maybeParsed, errors2 |> Dict.toList |> List.filter (\( _, value ) -> value |> List.isEmpty |> not) |> List.NonEmpty.fromList ) of
|
|
903
904
|
( Just decodedFinal, Nothing ) ->
|
|
904
905
|
Ok
|
|
905
|
-
( Form.Response
|
|
906
|
+
( Pages.Internal.Form.Response
|
|
906
907
|
{ fields = rawFormData_
|
|
907
908
|
, errors = Dict.empty
|
|
909
|
+
, clientErrors = Dict.empty
|
|
908
910
|
}
|
|
909
911
|
, decodedFinal
|
|
910
912
|
)
|
|
911
913
|
|
|
912
|
-
|
|
914
|
+
_ ->
|
|
913
915
|
Err
|
|
914
|
-
(Form.Response
|
|
916
|
+
(Pages.Internal.Form.Response
|
|
915
917
|
{ fields = rawFormData_
|
|
916
|
-
, errors =
|
|
917
|
-
|
|
918
|
-
|> Maybe.map List.NonEmpty.toList
|
|
919
|
-
|> Maybe.withDefault []
|
|
920
|
-
|> Dict.fromList
|
|
918
|
+
, errors = errors2
|
|
919
|
+
, clientErrors = errors
|
|
921
920
|
}
|
|
922
921
|
)
|
|
923
922
|
)
|
|
@@ -925,16 +924,17 @@ formDataWithServerValidation formParsers =
|
|
|
925
924
|
|
|
926
925
|
( _, maybeErrors ) ->
|
|
927
926
|
Err
|
|
928
|
-
(Form.Response
|
|
927
|
+
(Pages.Internal.Form.Response
|
|
929
928
|
{ fields = rawFormData_
|
|
930
929
|
, errors =
|
|
931
930
|
maybeErrors
|
|
932
931
|
|> Maybe.map List.NonEmpty.toList
|
|
933
932
|
|> Maybe.withDefault []
|
|
934
933
|
|> Dict.fromList
|
|
934
|
+
, clientErrors = Dict.empty
|
|
935
935
|
}
|
|
936
936
|
)
|
|
937
|
-
|>
|
|
937
|
+
|> BackendTask.succeed
|
|
938
938
|
|> succeed
|
|
939
939
|
)
|
|
940
940
|
|
|
@@ -942,7 +942,7 @@ formDataWithServerValidation formParsers =
|
|
|
942
942
|
{-| -}
|
|
943
943
|
formData :
|
|
944
944
|
Form.ServerForms error combined
|
|
945
|
-
-> Parser (Result { fields : List ( String, String ), errors : Dict String (List error) } combined)
|
|
945
|
+
-> Parser ( Form.Response error, Result { fields : List ( String, String ), errors : Dict String (List error), clientErrors : Dict String (List error) } combined )
|
|
946
946
|
formData formParsers =
|
|
947
947
|
rawFormData
|
|
948
948
|
|> andThen
|
|
@@ -955,18 +955,27 @@ formData formParsers =
|
|
|
955
955
|
in
|
|
956
956
|
case ( maybeDecoded, errors |> Dict.toList |> List.filter (\( _, value ) -> value |> List.isEmpty |> not) |> List.NonEmpty.fromList ) of
|
|
957
957
|
( Just decoded, Nothing ) ->
|
|
958
|
-
|
|
958
|
+
( Pages.Internal.Form.Response { fields = [], errors = Dict.empty, clientErrors = Dict.empty }
|
|
959
|
+
, Ok decoded
|
|
960
|
+
)
|
|
959
961
|
|> succeed
|
|
960
962
|
|
|
961
963
|
( _, maybeErrors ) ->
|
|
962
|
-
|
|
963
|
-
{ fields
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
964
|
+
let
|
|
965
|
+
record : { fields : List ( String, String ), errors : Dict String (List error), clientErrors : Dict String (List error) }
|
|
966
|
+
record =
|
|
967
|
+
{ fields = rawFormData_
|
|
968
|
+
, errors = Dict.empty
|
|
969
|
+
, clientErrors =
|
|
970
|
+
maybeErrors
|
|
971
|
+
|> Maybe.map List.NonEmpty.toList
|
|
972
|
+
|> Maybe.withDefault []
|
|
973
|
+
|> Dict.fromList
|
|
974
|
+
}
|
|
975
|
+
in
|
|
976
|
+
( Pages.Internal.Form.Response record
|
|
977
|
+
, Err record
|
|
978
|
+
)
|
|
970
979
|
|> succeed
|
|
971
980
|
)
|
|
972
981
|
|