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.
Files changed (109) hide show
  1. package/README.md +10 -1
  2. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2420 -1592
  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 +15215 -13007
  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 +8 -6
  15. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +189 -17
  16. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +255 -21
  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 +14620 -12636
  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 +8 -8
  26. package/generator/src/RouteBuilder.elm +66 -52
  27. package/generator/src/SharedTemplate.elm +3 -2
  28. package/generator/src/SiteConfig.elm +3 -2
  29. package/generator/src/basepath-middleware.js +3 -3
  30. package/generator/src/build.js +122 -86
  31. package/generator/src/cli.js +247 -51
  32. package/generator/src/codegen.js +29 -27
  33. package/generator/src/compatibility-key.js +1 -0
  34. package/generator/src/compile-elm.js +20 -22
  35. package/generator/src/config.js +39 -0
  36. package/generator/src/copy-dir.js +2 -2
  37. package/generator/src/dev-server.js +119 -110
  38. package/generator/src/dir-helpers.js +9 -26
  39. package/generator/src/elm-codegen.js +5 -4
  40. package/generator/src/elm-file-constants.js +2 -3
  41. package/generator/src/error-formatter.js +12 -11
  42. package/generator/src/file-helpers.js +3 -4
  43. package/generator/src/generate-template-module-connector.js +14 -21
  44. package/generator/src/init.js +8 -7
  45. package/generator/src/pre-render-html.js +41 -28
  46. package/generator/src/render-test.js +109 -0
  47. package/generator/src/render-worker.js +26 -28
  48. package/generator/src/render.js +322 -142
  49. package/generator/src/request-cache.js +200 -162
  50. package/generator/src/rewrite-client-elm-json.js +5 -5
  51. package/generator/src/rewrite-elm-json.js +7 -7
  52. package/generator/src/route-codegen-helpers.js +16 -31
  53. package/generator/src/seo-renderer.js +12 -7
  54. package/generator/src/vite-utils.js +77 -0
  55. package/generator/static-code/hmr.js +16 -2
  56. package/generator/template/app/Api.elm +3 -3
  57. package/generator/template/app/Route/Index.elm +3 -3
  58. package/generator/template/app/Shared.elm +3 -3
  59. package/generator/template/app/Site.elm +9 -4
  60. package/package.json +21 -21
  61. package/src/ApiRoute.elm +199 -61
  62. package/src/BackendTask/Custom.elm +214 -0
  63. package/src/BackendTask/Env.elm +90 -0
  64. package/src/{DataSource → BackendTask}/File.elm +128 -43
  65. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  66. package/src/BackendTask/Http.elm +673 -0
  67. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  68. package/src/BackendTask/Internal/Request.elm +28 -0
  69. package/src/BackendTask/Random.elm +79 -0
  70. package/src/BackendTask/Time.elm +47 -0
  71. package/src/BackendTask.elm +537 -0
  72. package/src/FatalError.elm +89 -0
  73. package/src/Form/Field.elm +1 -1
  74. package/src/Form.elm +72 -92
  75. package/src/Head/Seo.elm +4 -4
  76. package/src/Head.elm +237 -7
  77. package/src/HtmlPrinter.elm +7 -3
  78. package/src/Internal/ApiRoute.elm +7 -5
  79. package/src/PageServerResponse.elm +6 -1
  80. package/src/Pages/Generate.elm +775 -132
  81. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  82. package/src/Pages/Internal/FatalError.elm +5 -0
  83. package/src/Pages/Internal/Form.elm +21 -1
  84. package/src/Pages/Internal/Platform/Cli.elm +479 -747
  85. package/src/Pages/Internal/Platform/Cli.elm.bak +1276 -0
  86. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  87. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  88. package/src/Pages/Internal/Platform/GeneratorApplication.elm +373 -0
  89. package/src/Pages/Internal/Platform/StaticResponses.elm +73 -270
  90. package/src/Pages/Internal/Platform/ToJsPayload.elm +4 -7
  91. package/src/Pages/Internal/Platform.elm +54 -53
  92. package/src/Pages/Internal/Script.elm +17 -0
  93. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  94. package/src/Pages/Manifest.elm +29 -4
  95. package/src/Pages/ProgramConfig.elm +12 -8
  96. package/src/Pages/Script.elm +109 -0
  97. package/src/Pages/SiteConfig.elm +3 -2
  98. package/src/Pages/StaticHttp/Request.elm +2 -2
  99. package/src/Pages/StaticHttpRequest.elm +23 -98
  100. package/src/RequestsAndPending.elm +8 -19
  101. package/src/Result/Extra.elm +21 -0
  102. package/src/Server/Request.elm +43 -34
  103. package/src/Server/Session.elm +166 -100
  104. package/src/Server/SetCookie.elm +89 -31
  105. package/src/DataSource/Env.elm +0 -38
  106. package/src/DataSource/Http.elm +0 -446
  107. package/src/DataSource/Internal/Request.elm +0 -20
  108. package/src/DataSource/Port.elm +0 -90
  109. package/src/DataSource.elm +0 -538
@@ -1,8 +1,8 @@
1
- module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve, resolve, resolveUrls, toBuildError)
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 List.Extra
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
- | RequestError Error
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
- = MissingHttpResponse String (List Pages.StaticHttp.Request.Request)
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 `DataSource.fail` with message: " ++ decodeErrorMessage
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
- resolve : RawRequest value -> RequestsAndPending -> Result Error value
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) Dict.empty of
52
+ case lookupFn (Just mockResolver) (Json.Encode.object []) of
82
53
  nextRequest ->
83
54
  mockResolve nextRequest mockResolver
84
55
 
85
56
  ApiRoute value ->
86
- Ok value
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
- RequestError error ->
138
- case error of
139
- MissingHttpResponse _ _ ->
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
- DecoderError _ ->
144
- HasPermanentError error
70
+ else
71
+ Incomplete urlList (Request [] lookupFn)
145
72
 
146
- UserCalledStaticHttpFail _ ->
147
- HasPermanentError error
73
+ ApiRoute value ->
74
+ Complete value
148
75
 
149
- Request urlList lookupFn ->
150
- cacheRequestResolutionHelp urlList
151
- rawResponses
152
- (lookupFn Nothing rawResponses)
153
76
 
154
- ApiRoute _ ->
155
- Complete
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(..), batchDecoder, bodyEncoder, decoder, get)
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
- Dict String (Maybe Response)
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
- requestsAndPending
121
- |> Dict.get key
122
- |> Maybe.andThen identity
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
@@ -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 exposing (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 -> DataSource Data`:
122
+ That's why `RouteBuilder.preRender` has `data : RouteParams -> BackendTask Data`:
122
123
 
123
- import DataSource exposing (DataSource)
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 -> DataSource Data
130
+ data : RouteParams -> BackendTask Data
130
131
  data routeParams =
131
- DataSource.succeed Data
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 (DataSource (Response Data))`. That means that you
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 DataSource exposing (DataSource)
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 (DataSource (Response Data))
165
+ -> Request.Parser (BackendTask (Response Data))
165
166
  data routeParams =
166
167
  {}
167
168
  |> Server.Response.render
168
- |> DataSource.succeed
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 (DataSource response) -> Json.Decode.Decoder (Result ( ValidationError, List ValidationError ) (DataSource response))
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 (DataSource (Validation error combined kind constraints))
885
- -> Parser (DataSource (Result (Form.Response error) ( Form.Response error, combined )))
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
- |> DataSource.map
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
- ( _, maybeErrors ) ->
914
+ _ ->
913
915
  Err
914
- (Form.Response
916
+ (Pages.Internal.Form.Response
915
917
  { fields = rawFormData_
916
- , errors =
917
- maybeErrors
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
- |> DataSource.succeed
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
- Ok decoded
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
- Err
963
- { fields = rawFormData_
964
- , errors =
965
- maybeErrors
966
- |> Maybe.map List.NonEmpty.toList
967
- |> Maybe.withDefault []
968
- |> Dict.fromList
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