elm-pages 3.0.0-beta.8 → 3.0.0

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 (164) hide show
  1. package/README.md +11 -2
  2. package/adapter/netlify.js +207 -0
  3. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2730 -2938
  4. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  5. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  6. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  7. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  8. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  9. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  10. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16840 -13653
  13. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  14. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +2 -2
  15. package/generator/dead-code-review/elm.json +9 -7
  16. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +59 -10
  17. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +52 -36
  18. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
  19. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
  20. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
  21. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
  22. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  23. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  24. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  25. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  26. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
  27. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25118 -21832
  28. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  29. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +2 -2
  30. package/generator/review/elm.json +10 -10
  31. package/generator/src/RouteBuilder.elm +93 -128
  32. package/generator/src/SharedTemplate.elm +8 -7
  33. package/generator/src/SiteConfig.elm +3 -2
  34. package/generator/src/basepath-middleware.js +3 -3
  35. package/generator/src/build.js +147 -63
  36. package/generator/src/cli.js +292 -88
  37. package/generator/src/codegen.js +29 -27
  38. package/generator/src/compatibility-key.js +3 -0
  39. package/generator/src/compile-elm.js +43 -26
  40. package/generator/src/config.js +2 -4
  41. package/generator/src/copy-dir.js +2 -2
  42. package/generator/src/dev-server.js +159 -92
  43. package/generator/src/dir-helpers.js +9 -26
  44. package/generator/src/elm-codegen.js +5 -4
  45. package/generator/src/elm-file-constants.js +2 -3
  46. package/generator/src/error-formatter.js +12 -11
  47. package/generator/src/file-helpers.js +3 -4
  48. package/generator/src/generate-template-module-connector.js +23 -23
  49. package/generator/src/init.js +9 -8
  50. package/generator/src/pre-render-html.js +10 -13
  51. package/generator/src/render-test.js +109 -0
  52. package/generator/src/render-worker.js +25 -28
  53. package/generator/src/render.js +321 -142
  54. package/generator/src/request-cache.js +265 -162
  55. package/generator/src/resolve-elm-module.js +64 -0
  56. package/generator/src/rewrite-client-elm-json.js +6 -5
  57. package/generator/src/rewrite-elm-json-help.js +56 -0
  58. package/generator/src/rewrite-elm-json.js +17 -7
  59. package/generator/src/route-codegen-helpers.js +16 -31
  60. package/generator/src/seo-renderer.js +12 -7
  61. package/generator/src/vite-utils.js +1 -2
  62. package/generator/static-code/elm-pages.js +10 -0
  63. package/generator/static-code/hmr.js +79 -13
  64. package/generator/template/app/Api.elm +3 -2
  65. package/generator/template/app/Effect.elm +155 -0
  66. package/generator/template/app/ErrorPage.elm +49 -6
  67. package/generator/template/app/Route/Blog/Slug_.elm +86 -0
  68. package/generator/template/app/Route/Greet.elm +107 -0
  69. package/generator/template/app/Route/Hello.elm +119 -0
  70. package/generator/template/app/Route/Index.elm +26 -25
  71. package/generator/template/app/Shared.elm +38 -39
  72. package/generator/template/app/Site.elm +4 -7
  73. package/generator/template/app/View.elm +9 -8
  74. package/generator/template/codegen/elm.codegen.json +18 -0
  75. package/generator/template/custom-backend-task.ts +3 -0
  76. package/generator/template/elm-pages.config.mjs +13 -0
  77. package/generator/template/elm-tooling.json +0 -3
  78. package/generator/template/elm.json +25 -20
  79. package/generator/template/index.ts +1 -2
  80. package/generator/template/netlify.toml +4 -1
  81. package/generator/template/package.json +10 -4
  82. package/generator/template/script/.elm-pages/compiled-ports/custom-backend-task.mjs +7 -0
  83. package/generator/template/script/custom-backend-task.ts +3 -0
  84. package/generator/template/script/elm.json +61 -0
  85. package/generator/template/script/src/AddRoute.elm +312 -0
  86. package/generator/template/script/src/Stars.elm +42 -0
  87. package/package.json +30 -27
  88. package/src/ApiRoute.elm +249 -85
  89. package/src/BackendTask/Custom.elm +325 -0
  90. package/src/BackendTask/Env.elm +90 -0
  91. package/src/{DataSource → BackendTask}/File.elm +171 -56
  92. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  93. package/src/BackendTask/Http.elm +679 -0
  94. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  95. package/src/BackendTask/Internal/Request.elm +69 -0
  96. package/src/BackendTask/Random.elm +79 -0
  97. package/src/BackendTask/Time.elm +47 -0
  98. package/src/BackendTask.elm +531 -0
  99. package/src/FatalError.elm +90 -0
  100. package/src/FormData.elm +21 -18
  101. package/src/Head/Seo.elm +4 -4
  102. package/src/Head.elm +237 -7
  103. package/src/Internal/ApiRoute.elm +7 -5
  104. package/src/Internal/Request.elm +84 -4
  105. package/src/PageServerResponse.elm +6 -1
  106. package/src/Pages/ConcurrentSubmission.elm +127 -0
  107. package/src/Pages/Form.elm +340 -0
  108. package/src/Pages/FormData.elm +19 -0
  109. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  110. package/src/Pages/Internal/FatalError.elm +5 -0
  111. package/src/Pages/Internal/Msg.elm +93 -0
  112. package/src/Pages/Internal/NotFoundReason.elm +4 -4
  113. package/src/Pages/Internal/Platform/Cli.elm +629 -767
  114. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  115. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  116. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  117. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  118. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  119. package/src/Pages/Internal/Platform.elm +330 -203
  120. package/src/Pages/Internal/ResponseSketch.elm +2 -2
  121. package/src/Pages/Internal/Script.elm +17 -0
  122. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  123. package/src/Pages/Manifest.elm +52 -11
  124. package/src/Pages/Navigation.elm +85 -0
  125. package/src/Pages/PageUrl.elm +26 -12
  126. package/src/Pages/ProgramConfig.elm +32 -22
  127. package/src/Pages/Script.elm +166 -0
  128. package/src/Pages/SiteConfig.elm +3 -2
  129. package/src/Pages/StaticHttp/Request.elm +2 -2
  130. package/src/Pages/StaticHttpRequest.elm +23 -99
  131. package/src/Pages/Url.elm +3 -3
  132. package/src/PagesMsg.elm +88 -0
  133. package/src/QueryParams.elm +21 -172
  134. package/src/RenderRequest.elm +7 -7
  135. package/src/RequestsAndPending.elm +37 -20
  136. package/src/Result/Extra.elm +26 -0
  137. package/src/Scaffold/Form.elm +569 -0
  138. package/src/Scaffold/Route.elm +1431 -0
  139. package/src/Server/Request.elm +476 -1001
  140. package/src/Server/Response.elm +130 -36
  141. package/src/Server/Session.elm +181 -111
  142. package/src/Server/SetCookie.elm +80 -32
  143. package/src/Stub.elm +53 -0
  144. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  145. package/src/{Path.elm → UrlPath.elm} +33 -36
  146. package/generator/template/public/images/icon-png.png +0 -0
  147. package/src/DataSource/Env.elm +0 -38
  148. package/src/DataSource/Http.elm +0 -446
  149. package/src/DataSource/Internal/Request.elm +0 -20
  150. package/src/DataSource/Port.elm +0 -90
  151. package/src/DataSource.elm +0 -538
  152. package/src/Form/Field.elm +0 -717
  153. package/src/Form/FieldStatus.elm +0 -36
  154. package/src/Form/FieldView.elm +0 -417
  155. package/src/Form/FormData.elm +0 -22
  156. package/src/Form/Validation.elm +0 -391
  157. package/src/Form/Value.elm +0 -118
  158. package/src/Form.elm +0 -1683
  159. package/src/FormDecoder.elm +0 -102
  160. package/src/Pages/FormState.elm +0 -256
  161. package/src/Pages/Generate.elm +0 -1151
  162. package/src/Pages/Internal/Form.elm +0 -17
  163. package/src/Pages/Msg.elm +0 -79
  164. package/src/Pages/Transition.elm +0 -70
@@ -1,10 +1,10 @@
1
1
  module Server.Response exposing
2
2
  ( Response
3
- , json, plainText, temporaryRedirect, permanentRedirect
4
- , emptyBody, body, bytesBody, base64Body
5
3
  , render
6
- , errorPage, mapError
7
4
  , map
5
+ , errorPage, mapError
6
+ , temporaryRedirect, permanentRedirect
7
+ , json, plainText, emptyBody, body, bytesBody, base64Body
8
8
  , withHeader, withHeaders, withStatusCode, withSetCookieHeader
9
9
  , toJson
10
10
  )
@@ -16,41 +16,72 @@ module Server.Response exposing
16
16
 
17
17
  @docs Response
18
18
 
19
- There are two top-level response types:
20
-
21
- 1. Server Responses
22
- 2. Render Responses
23
-
24
- A Server Response is a way to directly send a low-level server response, with no additional magic. You can set a String body,
25
- a list of headers, the status code, etc. The Server Response helpers like `json` and `temporaryRedirect` are just helpers for
26
- building up those low-level Server Responses.
27
-
28
- Render Responses are a little more special in the way they are connected to your elm-pages app. They allow you to render
29
- the current Route Module. To do that, you'll need to pass along the `data` for your Route Module.
30
-
31
- You can use `withHeader` and `withStatusCode` to customize either type of Response (Server Responses or Render Responses).
32
19
 
20
+ ## Response's for Route Modules
33
21
 
34
- ## Server Responses
22
+ In a server-rendered Route Module, you return a [`Response`](#Response). You'll typically want to return one of 3 types of Responses
23
+ from your Route Modules:
35
24
 
36
- @docs json, plainText, temporaryRedirect, permanentRedirect
25
+ - [`Server.Response.render`](#render) to render the current Route Module
26
+ - [`Server.Response.errorPage`](#errorPage) to render an ErrorPage
27
+ - [`Server.Response.temporaryRedirect`](#temporaryRedirect) to redirect to another page (the easiest way to build a redirect response is with `Route.redirectTo : Route -> Response data error`).
37
28
 
29
+ ```
30
+ import Server.Response as Response
31
+ import Route
38
32
 
39
- ## Custom Responses
33
+ data routeParams request =
34
+ case loggedInUser request of
35
+ Just user ->
36
+ findProjectById routeParams.id user
37
+ |> BackendTask.map
38
+ (\maybeProject ->
39
+ case maybeProject of
40
+ Just project ->
41
+ Response.render project
40
42
 
41
- @docs emptyBody, body, bytesBody, base64Body
43
+ Nothing ->
44
+ Response.errorPage ErrorPage.notFound
45
+ )
46
+ Nothing ->
47
+ -- the generated module `Route` contains a high-level helper for returning a redirect `Response`
48
+ Route.redirectTo Route.Login
49
+ ```
42
50
 
43
51
 
44
52
  ## Render Responses
45
53
 
46
54
  @docs render
47
55
 
56
+ @docs map
57
+
48
58
 
49
59
  ## Rendering Error Pages
50
60
 
51
61
  @docs errorPage, mapError
52
62
 
53
- @docs map
63
+
64
+ ## Redirects
65
+
66
+ @docs temporaryRedirect, permanentRedirect
67
+
68
+
69
+ ## Response's for Server-Rendered ApiRoutes
70
+
71
+ When defining your [server-rendered `ApiRoute`'s (`ApiRoute.serverRender`)](ApiRoute#serverRender) in your `app/Api.elm` module,
72
+ you can send a low-level server Response. You can set a String body,
73
+ a list of headers, the status code, etc. The Server Response helpers like `json` and `temporaryRedirect` are just helpers for
74
+ building up those low-level Server Responses.
75
+
76
+ Render Responses are a little more special in the way they are connected to your elm-pages app. They allow you to render
77
+ the current Route Module. To do that, you'll need to pass along the `data` for your Route Module.
78
+
79
+ You can use `withHeader` and `withStatusCode` to customize either type of Response (Server Responses or Render Responses).
80
+
81
+
82
+ ## Response Body
83
+
84
+ @docs json, plainText, emptyBody, body, bytesBody, base64Body
54
85
 
55
86
 
56
87
  ## Amending Responses
@@ -76,7 +107,8 @@ type alias Response data error =
76
107
  PageServerResponse data error
77
108
 
78
109
 
79
- {-| -}
110
+ {-| Maps the `data` for a Render response. Usually not needed, but always good to have the option.
111
+ -}
80
112
  map : (data -> mappedData) -> Response data error -> Response mappedData error
81
113
  map mapFn pageServerResponse =
82
114
  case pageServerResponse of
@@ -90,7 +122,8 @@ map mapFn pageServerResponse =
90
122
  ErrorPage error response
91
123
 
92
124
 
93
- {-| -}
125
+ {-| Maps the `error` for an ErrorPage response. Usually not needed, but always good to have the option.
126
+ -}
94
127
  mapError : (errorPage -> mappedErrorPage) -> Response data errorPage -> Response data mappedErrorPage
95
128
  mapError mapFn pageServerResponse =
96
129
  case pageServerResponse of
@@ -104,7 +137,11 @@ mapError mapFn pageServerResponse =
104
137
  ErrorPage (mapFn error) response
105
138
 
106
139
 
107
- {-| -}
140
+ {-| Build a `Response` with a String body. Sets the `Content-Type` to `text/plain`.
141
+
142
+ Response.plainText "Hello"
143
+
144
+ -}
108
145
  plainText : String -> Response data error
109
146
  plainText string =
110
147
  { statusCode = 200
@@ -115,7 +152,11 @@ plainText string =
115
152
  |> ServerResponse
116
153
 
117
154
 
118
- {-| -}
155
+ {-| Render the Route Module with the supplied data. Used for both the `data` and `action` functions in a server-rendered Route Module.
156
+
157
+ Response.render project
158
+
159
+ -}
119
160
  render : data -> Response data error
120
161
  render data =
121
162
  RenderPage
@@ -123,13 +164,19 @@ render data =
123
164
  data
124
165
 
125
166
 
126
- {-| -}
167
+ {-| Instead of rendering the current Route Module, you can render an `ErrorPage` such as a 404 page or a 500 error page.
168
+
169
+ [Read more about Error Pages](https://elm-pages.com/docs/error-pages) to learn about
170
+ defining and rendering your custom ErrorPage type.
171
+
172
+ -}
127
173
  errorPage : errorPage -> Response data errorPage
128
174
  errorPage errorPage_ =
129
175
  ErrorPage errorPage_ { headers = [] }
130
176
 
131
177
 
132
- {-| -}
178
+ {-| Build a `Response` with no HTTP response body.
179
+ -}
133
180
  emptyBody : Response data error
134
181
  emptyBody =
135
182
  { statusCode = 200
@@ -140,7 +187,8 @@ emptyBody =
140
187
  |> ServerResponse
141
188
 
142
189
 
143
- {-| -}
190
+ {-| Same as [`plainText`](#plainText), but doesn't set a `Content-Type`.
191
+ -}
144
192
  body : String -> Response data error
145
193
  body body_ =
146
194
  { statusCode = 200
@@ -151,7 +199,13 @@ body body_ =
151
199
  |> ServerResponse
152
200
 
153
201
 
154
- {-| -}
202
+ {-| Build a `Response` with a String that should represent a base64 encoded value.
203
+
204
+ Your adapter will need to handle `isBase64Encoded` to turn it into the appropriate response.
205
+
206
+ Response.base64Body "SGVsbG8gV29ybGQ="
207
+
208
+ -}
155
209
  base64Body : String -> Response data error
156
210
  base64Body base64String =
157
211
  { statusCode = 200
@@ -162,7 +216,12 @@ base64Body base64String =
162
216
  |> ServerResponse
163
217
 
164
218
 
165
- {-| -}
219
+ {-| Build a `Response` with a `Bytes`.
220
+
221
+ Under the hood, it will be converted to a base64 encoded String with `isBase64Encoded = True`.
222
+ Your adapter will need to handle `isBase64Encoded` to turn it into the appropriate response.
223
+
224
+ -}
166
225
  bytesBody : Bytes -> Response data error
167
226
  bytesBody bytes =
168
227
  { statusCode = 200
@@ -173,7 +232,15 @@ bytesBody bytes =
173
232
  |> ServerResponse
174
233
 
175
234
 
176
- {-| -}
235
+ {-| Build a JSON body from a `Json.Encode.Value`.
236
+
237
+ Json.Encode.object
238
+ [ ( "message", Json.Encode.string "Hello" ) ]
239
+ |> Response.json
240
+
241
+ Sets the `Content-Type` to `application/json`.
242
+
243
+ -}
177
244
  json : Json.Encode.Value -> Response data error
178
245
  json jsonValue =
179
246
  { statusCode = 200
@@ -226,7 +293,12 @@ temporaryRedirect url =
226
293
  |> ServerResponse
227
294
 
228
295
 
229
- {-| -}
296
+ {-| Set the [HTTP Response status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) for the `Response`.
297
+
298
+ Response.plainText "Not Authorized"
299
+ |> Response.withStatusCode 401
300
+
301
+ -}
230
302
  withStatusCode : Int -> Response data Never -> Response data Never
231
303
  withStatusCode statusCode serverResponse =
232
304
  case serverResponse of
@@ -240,7 +312,14 @@ withStatusCode statusCode serverResponse =
240
312
  never error
241
313
 
242
314
 
243
- {-| -}
315
+ {-| Add a header to the response.
316
+
317
+ Response.plainText "Hello!"
318
+ -- allow CORS requests
319
+ |> Response.withHeader "Access-Control-Allow-Origin" "*"
320
+ |> Response.withHeader "Access-Control-Allow-Methods" "GET, POST, OPTIONS"
321
+
322
+ -}
244
323
  withHeader : String -> String -> Response data error -> Response data error
245
324
  withHeader name value serverResponse =
246
325
  case serverResponse of
@@ -254,7 +333,16 @@ withHeader name value serverResponse =
254
333
  ErrorPage error { response | headers = ( name, value ) :: response.headers }
255
334
 
256
335
 
257
- {-| -}
336
+ {-| Same as [`withHeader`](#withHeader), but allows you to add multiple headers at once.
337
+
338
+ Response.plainText "Hello!"
339
+ -- allow CORS requests
340
+ |> Response.withHeaders
341
+ [ ( "Access-Control-Allow-Origin", "*" )
342
+ , ( "Access-Control-Allow-Methods", "GET, POST, OPTIONS" )
343
+ ]
344
+
345
+ -}
258
346
  withHeaders : List ( String, String ) -> Response data error -> Response data error
259
347
  withHeaders headers serverResponse =
260
348
  case serverResponse of
@@ -268,7 +356,12 @@ withHeaders headers serverResponse =
268
356
  ErrorPage error { response | headers = headers ++ response.headers }
269
357
 
270
358
 
271
- {-| -}
359
+ {-| Set a [`Server.SetCookie`](Server-SetCookie) value on the response.
360
+
361
+ The easiest way to manage cookies in your Routes is through the [`Server.Session`](Server-Session) API, but this
362
+ provides a more granular way to set cookies.
363
+
364
+ -}
272
365
  withSetCookieHeader : SetCookie -> Response data error -> Response data error
273
366
  withSetCookieHeader cookie response =
274
367
  response
@@ -278,7 +371,8 @@ withSetCookieHeader cookie response =
278
371
  )
279
372
 
280
373
 
281
- {-| -}
374
+ {-| For internal use or more advanced use cases for meta frameworks.
375
+ -}
282
376
  toJson : Response Never Never -> Json.Encode.Value
283
377
  toJson response =
284
378
  case response of