elm-pages 2.1.11 → 3.0.0-beta.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.
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -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/{template/public/style.css → review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock} +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 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +6795 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +27617 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +110 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +187 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/package.json +1 -0
- package/generator/review/elm-stuff/tests-0.19.1/src/Reporter.elm +26 -0
- package/generator/review/elm-stuff/tests-0.19.1/src/Runner.elm +62 -0
- package/generator/review/elm.json +13 -4
- package/{src → generator/review/src}/Pages/Review/NoContractViolations.elm +148 -148
- package/generator/review/tests/Pages/Review/NoContractViolationsTest.elm +331 -0
- package/generator/src/RouteBuilder.elm +420 -0
- package/generator/src/SharedTemplate.elm +4 -5
- package/generator/src/SiteConfig.elm +3 -9
- package/generator/src/build.js +308 -95
- package/generator/src/cli.js +103 -8
- package/generator/src/codegen.js +192 -35
- package/generator/src/compile-elm.js +183 -31
- package/generator/src/dev-server.js +353 -96
- package/generator/src/elm-application.json +3 -1
- package/generator/src/elm-codegen.js +34 -0
- package/generator/src/elm-file-constants.js +2 -0
- package/generator/src/error-formatter.js +20 -1
- package/generator/src/generate-template-module-connector.js +120 -924
- package/generator/src/hello.ts +5 -0
- package/generator/src/pre-render-html.js +58 -104
- package/generator/src/render-worker.js +27 -13
- package/generator/src/render.js +252 -197
- package/generator/src/request-cache-fs.js +18 -0
- package/generator/src/request-cache.js +128 -56
- package/generator/src/rewrite-client-elm-json.js +49 -0
- package/generator/src/route-codegen-helpers.js +62 -1
- package/generator/static-code/dev-style.css +22 -0
- package/generator/static-code/elm-pages.js +43 -39
- package/generator/static-code/hmr.js +98 -88
- package/generator/template/app/Api.elm +25 -0
- package/generator/template/app/ErrorPage.elm +38 -0
- package/generator/template/app/Route/Index.elm +87 -0
- package/generator/template/{src → app}/Shared.elm +34 -13
- package/generator/template/app/Site.elm +19 -0
- package/generator/template/{src → app}/View.elm +0 -0
- package/generator/template/elm-pages.config.mjs +5 -0
- package/generator/template/elm.json +1 -0
- package/generator/template/{public/index.js → index.ts} +7 -3
- package/generator/template/package.json +4 -4
- package/generator/template/public/favicon.ico +0 -0
- package/generator/template/public/images/icon-png.png +0 -0
- package/generator/template/src/.gitkeep +0 -0
- package/generator/template/style.css +4 -0
- package/package.json +30 -23
- package/src/ApiRoute.elm +176 -43
- package/src/BuildError.elm +10 -1
- package/src/CookieParser.elm +84 -0
- package/src/DataSource/Env.elm +38 -0
- package/src/DataSource/File.elm +27 -16
- package/src/DataSource/Glob.elm +126 -80
- package/src/DataSource/Http.elm +283 -304
- package/src/DataSource/Internal/Glob.elm +5 -21
- package/src/DataSource/Internal/Request.elm +25 -0
- package/src/DataSource/Port.elm +17 -14
- package/src/DataSource.elm +55 -318
- package/src/Form/Field.elm +717 -0
- package/src/Form/FieldStatus.elm +36 -0
- package/src/Form/FieldView.elm +417 -0
- package/src/Form/FormData.elm +22 -0
- package/src/Form/Validation.elm +391 -0
- package/src/Form/Value.elm +118 -0
- package/src/Form.elm +1683 -0
- package/src/FormData.elm +58 -0
- package/src/FormDecoder.elm +102 -0
- package/src/Head/Seo.elm +12 -4
- package/src/Head.elm +12 -2
- package/src/HtmlPrinter.elm +1 -1
- package/src/Internal/ApiRoute.elm +17 -4
- package/src/Internal/Request.elm +7 -0
- package/src/PageServerResponse.elm +68 -0
- package/src/Pages/ContentCache.elm +1 -229
- package/src/Pages/Fetcher.elm +58 -0
- package/src/Pages/FormState.elm +256 -0
- package/src/Pages/Generate.elm +800 -0
- package/src/Pages/Internal/Form.elm +17 -0
- package/src/Pages/Internal/NotFoundReason.elm +3 -55
- package/src/Pages/Internal/Platform/Cli.elm +777 -579
- package/src/Pages/Internal/Platform/Effect.elm +5 -5
- package/src/Pages/Internal/Platform/StaticResponses.elm +178 -394
- package/src/Pages/Internal/Platform/ToJsPayload.elm +24 -23
- package/src/Pages/Internal/Platform.elm +1244 -504
- package/src/Pages/Internal/ResponseSketch.elm +19 -0
- package/src/Pages/Internal/RoutePattern.elm +596 -45
- package/src/Pages/Manifest.elm +26 -0
- package/src/Pages/Msg.elm +79 -0
- package/src/Pages/ProgramConfig.elm +67 -14
- package/src/Pages/SiteConfig.elm +3 -6
- package/src/Pages/StaticHttp/Request.elm +4 -2
- package/src/Pages/StaticHttpRequest.elm +50 -215
- package/src/Pages/Transition.elm +70 -0
- package/src/Path.elm +1 -0
- package/src/Pattern.elm +98 -0
- package/src/RenderRequest.elm +2 -2
- package/src/RequestsAndPending.elm +111 -9
- package/src/Server/Request.elm +1253 -0
- package/src/Server/Response.elm +292 -0
- package/src/Server/Session.elm +316 -0
- package/src/Server/SetCookie.elm +169 -0
- package/src/TerminalText.elm +1 -1
- package/src/Test/Html/Internal/ElmHtml/Markdown.elm +0 -1
- package/src/Test/Html/Internal/ElmHtml/ToString.elm +1 -1
- package/generator/src/Page.elm +0 -359
- package/generator/src/codegen-template-module.js +0 -183
- package/generator/src/elm-pages-js-minified.js +0 -1
- package/generator/template/src/Api.elm +0 -14
- package/generator/template/src/Page/Index.elm +0 -69
- package/generator/template/src/Site.elm +0 -41
- package/src/DataSource/ServerRequest.elm +0 -60
- package/src/Internal/OptimizedDecoder.elm +0 -18
- package/src/KeepOrDiscard.elm +0 -6
- package/src/OptimizedDecoder/Pipeline.elm +0 -335
- package/src/OptimizedDecoder.elm +0 -818
- package/src/Pages/Internal/ApplicationType.elm +0 -6
- package/src/Pages/Secrets.elm +0 -83
- package/src/Secrets.elm +0 -111
- package/src/SecretsDict.elm +0 -45
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
module RouteBuilder exposing
|
|
2
|
+
( StatelessRoute, buildNoState
|
|
3
|
+
, StaticPayload
|
|
4
|
+
, withOnAction
|
|
5
|
+
, buildWithLocalState, buildWithSharedState
|
|
6
|
+
, preRender, single
|
|
7
|
+
, preRenderWithFallback, serverRender
|
|
8
|
+
, Builder(..)
|
|
9
|
+
, StatefulRoute
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
{-|
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## Stateless Route Modules
|
|
16
|
+
|
|
17
|
+
The simplest Route Module you can build is one with no state. It still can use `DataSource`'s, but it has no `init`, `update`, or `subscriptions`.
|
|
18
|
+
|
|
19
|
+
It can read the `Shared.Model`, but it cannot send `Shared.Msg`'s to update the `Shared.Model`. If you need a `Model`, use `buildWithLocalState`.
|
|
20
|
+
|
|
21
|
+
If you need to _change_ Shared state, use `buildWithSharedState`.
|
|
22
|
+
|
|
23
|
+
@docs StatelessRoute, buildNoState
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Accessing Static Data
|
|
27
|
+
|
|
28
|
+
With `elm-pages`, you can have HTTP data available before a page is loaded, or read in a file, etc, using the DataSource API. Since the data
|
|
29
|
+
is available when the page is pre-rendered (as well as in the hydrated page), this is called Static Data.
|
|
30
|
+
|
|
31
|
+
An example of dynamic data would be keyboard input from the user, query params, or any other data that comes from the app running in the browser.
|
|
32
|
+
|
|
33
|
+
We have the following data during pre-render:
|
|
34
|
+
|
|
35
|
+
- `path` - the current path is static. In other words, we know the current path when we build an elm-pages site. Note that we **do not** know query parameters, fragments, etc. That is dynamic data. Pre-rendering occurs for paths in our app, but we don't know what possible query paremters might be used when those paths are hit.
|
|
36
|
+
- `data` - this will be the resolved `DataSource` for our page.
|
|
37
|
+
- `sharedData` - we can access any shared data between pages. For example, you may have fetched the name of a blog ("Jane's Blog") from the API for a Content Management System (CMS).
|
|
38
|
+
- `routeParams` - this is the record that includes any Dynamic Route Segments for the given page (or an empty record if there are none)
|
|
39
|
+
|
|
40
|
+
@docs StaticPayload
|
|
41
|
+
|
|
42
|
+
@docs withOnAction
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
## Stateful Route Modules
|
|
46
|
+
|
|
47
|
+
@docs buildWithLocalState, buildWithSharedState
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## Pre-Rendered Routes
|
|
51
|
+
|
|
52
|
+
A `single` page is just a Route that has no Dynamic Route Segments. For example, `Route.About` will have `type alias RouteParams = {}`, whereas `Route.Blog.Slug_` has a Dynamic Segment slug, and `type alias RouteParams = { slug : String }`.
|
|
53
|
+
|
|
54
|
+
When you run `elm-pages add About`, it will use `RouteBuilder.single { ... }` because it has empty `RouteParams`. When you run `elm-pages add Blog.Slug_`, will will use `RouteBuilder.preRender` because it has a Dynamic Route Segment.
|
|
55
|
+
|
|
56
|
+
So `RouteBuilder.single` is just a simplified version of `RouteBuilder.preRender`. If there are no Dynamic Route Segments, then you don't need to define which pages to render so `RouteBuilder.single` doesn't need a `pages` field.
|
|
57
|
+
|
|
58
|
+
When there are Dynamic Route Segments, you need to tell `elm-pages` which pages to render. For example:
|
|
59
|
+
|
|
60
|
+
page =
|
|
61
|
+
RouteBuilder.preRender
|
|
62
|
+
{ data = data
|
|
63
|
+
, pages = pages
|
|
64
|
+
, head = head
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
pages =
|
|
68
|
+
DataSource.succeed
|
|
69
|
+
[ { slug = "blog-post1" }
|
|
70
|
+
, { slug = "blog-post2" }
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
@docs preRender, single
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
## Rendering on the Server
|
|
77
|
+
|
|
78
|
+
@docs preRenderWithFallback, serverRender
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
## Internals
|
|
82
|
+
|
|
83
|
+
@docs Builder
|
|
84
|
+
@docs StatefulRoute
|
|
85
|
+
|
|
86
|
+
-}
|
|
87
|
+
|
|
88
|
+
import Bytes exposing (Bytes)
|
|
89
|
+
import DataSource exposing (DataSource)
|
|
90
|
+
import DataSource.Http
|
|
91
|
+
import Dict exposing (Dict)
|
|
92
|
+
import Effect exposing (Effect)
|
|
93
|
+
import ErrorPage exposing (ErrorPage)
|
|
94
|
+
import Head
|
|
95
|
+
import Http
|
|
96
|
+
import Pages.Fetcher
|
|
97
|
+
import Pages.FormState
|
|
98
|
+
import Pages.Internal.NotFoundReason exposing (NotFoundReason)
|
|
99
|
+
import Pages.Internal.RoutePattern exposing (RoutePattern)
|
|
100
|
+
import Pages.Msg
|
|
101
|
+
import Pages.PageUrl exposing (PageUrl)
|
|
102
|
+
import Pages.Transition
|
|
103
|
+
import Path exposing (Path)
|
|
104
|
+
import Server.Request
|
|
105
|
+
import Server.Response
|
|
106
|
+
import Shared
|
|
107
|
+
import View exposing (View)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
{-| -}
|
|
111
|
+
type alias StatefulRoute routeParams data action model msg =
|
|
112
|
+
{ data : routeParams -> DataSource (Server.Response.Response data ErrorPage)
|
|
113
|
+
, action : routeParams -> DataSource (Server.Response.Response action ErrorPage)
|
|
114
|
+
, staticRoutes : DataSource (List routeParams)
|
|
115
|
+
, view :
|
|
116
|
+
Maybe PageUrl
|
|
117
|
+
-> Shared.Model
|
|
118
|
+
-> model
|
|
119
|
+
-> StaticPayload data action routeParams
|
|
120
|
+
-> View (Pages.Msg.Msg msg)
|
|
121
|
+
, head :
|
|
122
|
+
StaticPayload data action routeParams
|
|
123
|
+
-> List Head.Tag
|
|
124
|
+
, init : Maybe PageUrl -> Shared.Model -> StaticPayload data action routeParams -> ( model, Effect msg )
|
|
125
|
+
, update : PageUrl -> StaticPayload data action routeParams -> msg -> model -> Shared.Model -> ( model, Effect msg, Maybe Shared.Msg )
|
|
126
|
+
, subscriptions : Maybe PageUrl -> routeParams -> Path -> model -> Shared.Model -> Sub msg
|
|
127
|
+
, handleRoute : { moduleName : List String, routePattern : RoutePattern } -> (routeParams -> List ( String, String )) -> routeParams -> DataSource (Maybe NotFoundReason)
|
|
128
|
+
, kind : String
|
|
129
|
+
, onAction : Maybe (action -> msg)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
{-| -}
|
|
134
|
+
type alias StatelessRoute routeParams data action =
|
|
135
|
+
StatefulRoute routeParams data action {} ()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
{-| -}
|
|
139
|
+
type alias StaticPayload data action routeParams =
|
|
140
|
+
{ data : data
|
|
141
|
+
, sharedData : Shared.Data
|
|
142
|
+
, routeParams : routeParams
|
|
143
|
+
, path : Path
|
|
144
|
+
, action : Maybe action
|
|
145
|
+
, submit :
|
|
146
|
+
{ fields : List ( String, String ), headers : List ( String, String ) }
|
|
147
|
+
-> Pages.Fetcher.Fetcher (Result Http.Error action)
|
|
148
|
+
, transition : Maybe Pages.Transition.Transition
|
|
149
|
+
, fetchers : Dict String (Pages.Transition.FetcherState (Maybe action))
|
|
150
|
+
, pageFormState : Pages.FormState.PageFormState
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
{-| -}
|
|
155
|
+
type Builder routeParams data action
|
|
156
|
+
= WithData
|
|
157
|
+
{ data : routeParams -> DataSource (Server.Response.Response data ErrorPage)
|
|
158
|
+
, action : routeParams -> DataSource (Server.Response.Response action ErrorPage)
|
|
159
|
+
, staticRoutes : DataSource (List routeParams)
|
|
160
|
+
, head :
|
|
161
|
+
StaticPayload data action routeParams
|
|
162
|
+
-> List Head.Tag
|
|
163
|
+
, serverless : Bool
|
|
164
|
+
, handleRoute :
|
|
165
|
+
{ moduleName : List String, routePattern : RoutePattern }
|
|
166
|
+
-> (routeParams -> List ( String, String ))
|
|
167
|
+
-> routeParams
|
|
168
|
+
-> DataSource (Maybe NotFoundReason)
|
|
169
|
+
, kind : String
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
{-| -}
|
|
174
|
+
buildNoState :
|
|
175
|
+
{ view :
|
|
176
|
+
Maybe PageUrl
|
|
177
|
+
-> Shared.Model
|
|
178
|
+
-> StaticPayload data action routeParams
|
|
179
|
+
-> View (Pages.Msg.Msg ())
|
|
180
|
+
}
|
|
181
|
+
-> Builder routeParams data action
|
|
182
|
+
-> StatefulRoute routeParams data action {} ()
|
|
183
|
+
buildNoState { view } builderState =
|
|
184
|
+
case builderState of
|
|
185
|
+
WithData record ->
|
|
186
|
+
{ view = \maybePageUrl sharedModel _ -> view maybePageUrl sharedModel
|
|
187
|
+
, head = record.head
|
|
188
|
+
, data = record.data
|
|
189
|
+
, action = record.action
|
|
190
|
+
, staticRoutes = record.staticRoutes
|
|
191
|
+
, init = \_ _ _ -> ( {}, Effect.none )
|
|
192
|
+
, update = \_ _ _ _ _ -> ( {}, Effect.none, Nothing )
|
|
193
|
+
, subscriptions = \_ _ _ _ _ -> Sub.none
|
|
194
|
+
, handleRoute = record.handleRoute
|
|
195
|
+
, kind = record.kind
|
|
196
|
+
, onAction = Nothing
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
{-| -}
|
|
201
|
+
withOnAction : (action -> msg) -> StatefulRoute routeParams data action model msg -> StatefulRoute routeParams data action model msg
|
|
202
|
+
withOnAction toMsg config =
|
|
203
|
+
{ config
|
|
204
|
+
| onAction = Just toMsg
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
{-| -}
|
|
209
|
+
buildWithLocalState :
|
|
210
|
+
{ view :
|
|
211
|
+
Maybe PageUrl
|
|
212
|
+
-> Shared.Model
|
|
213
|
+
-> model
|
|
214
|
+
-> StaticPayload data action routeParams
|
|
215
|
+
-> View (Pages.Msg.Msg msg)
|
|
216
|
+
, init : Maybe PageUrl -> Shared.Model -> StaticPayload data action routeParams -> ( model, Effect msg )
|
|
217
|
+
, update : PageUrl -> Shared.Model -> StaticPayload data action routeParams -> msg -> model -> ( model, Effect msg )
|
|
218
|
+
, subscriptions : Maybe PageUrl -> routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
219
|
+
}
|
|
220
|
+
-> Builder routeParams data action
|
|
221
|
+
-> StatefulRoute routeParams data action model msg
|
|
222
|
+
buildWithLocalState config builderState =
|
|
223
|
+
case builderState of
|
|
224
|
+
WithData record ->
|
|
225
|
+
{ view =
|
|
226
|
+
\model sharedModel staticPayload ->
|
|
227
|
+
config.view model sharedModel staticPayload
|
|
228
|
+
, head = record.head
|
|
229
|
+
, data = record.data
|
|
230
|
+
, action = record.action
|
|
231
|
+
, staticRoutes = record.staticRoutes
|
|
232
|
+
, init = config.init
|
|
233
|
+
, update =
|
|
234
|
+
\pageUrl staticPayload msg model sharedModel ->
|
|
235
|
+
let
|
|
236
|
+
( updatedModel, cmd ) =
|
|
237
|
+
config.update
|
|
238
|
+
pageUrl
|
|
239
|
+
sharedModel
|
|
240
|
+
staticPayload
|
|
241
|
+
msg
|
|
242
|
+
model
|
|
243
|
+
in
|
|
244
|
+
( updatedModel, cmd, Nothing )
|
|
245
|
+
, subscriptions =
|
|
246
|
+
\maybePageUrl routeParams path model sharedModel ->
|
|
247
|
+
config.subscriptions maybePageUrl routeParams path sharedModel model
|
|
248
|
+
, handleRoute = record.handleRoute
|
|
249
|
+
, kind = record.kind
|
|
250
|
+
, onAction = Nothing
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
{-| -}
|
|
255
|
+
buildWithSharedState :
|
|
256
|
+
{ view :
|
|
257
|
+
Maybe PageUrl
|
|
258
|
+
-> Shared.Model
|
|
259
|
+
-> model
|
|
260
|
+
-> StaticPayload data action routeParams
|
|
261
|
+
-> View (Pages.Msg.Msg msg)
|
|
262
|
+
, init : Maybe PageUrl -> Shared.Model -> StaticPayload data action routeParams -> ( model, Effect msg )
|
|
263
|
+
, update : PageUrl -> Shared.Model -> StaticPayload data action routeParams -> msg -> model -> ( model, Effect msg, Maybe Shared.Msg )
|
|
264
|
+
, subscriptions : Maybe PageUrl -> routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
265
|
+
}
|
|
266
|
+
-> Builder routeParams data action
|
|
267
|
+
-> StatefulRoute routeParams data action model msg
|
|
268
|
+
buildWithSharedState config builderState =
|
|
269
|
+
case builderState of
|
|
270
|
+
WithData record ->
|
|
271
|
+
{ view = config.view
|
|
272
|
+
, head = record.head
|
|
273
|
+
, data = record.data
|
|
274
|
+
, action = record.action
|
|
275
|
+
, staticRoutes = record.staticRoutes
|
|
276
|
+
, init = config.init
|
|
277
|
+
, update =
|
|
278
|
+
\pageUrl staticPayload msg model sharedModel ->
|
|
279
|
+
config.update pageUrl
|
|
280
|
+
sharedModel
|
|
281
|
+
staticPayload
|
|
282
|
+
msg
|
|
283
|
+
model
|
|
284
|
+
, subscriptions =
|
|
285
|
+
\maybePageUrl routeParams path model sharedModel ->
|
|
286
|
+
config.subscriptions maybePageUrl routeParams path sharedModel model
|
|
287
|
+
, handleRoute = record.handleRoute
|
|
288
|
+
, kind = record.kind
|
|
289
|
+
, onAction = Nothing
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
{-| -}
|
|
294
|
+
single :
|
|
295
|
+
{ data : DataSource data
|
|
296
|
+
, head : StaticPayload data action {} -> List Head.Tag
|
|
297
|
+
}
|
|
298
|
+
-> Builder {} data action
|
|
299
|
+
single { data, head } =
|
|
300
|
+
WithData
|
|
301
|
+
{ data = \_ -> data |> DataSource.map Server.Response.render
|
|
302
|
+
, action = \_ -> DataSource.fail "Internal Error - actions should never be called for statically generated pages."
|
|
303
|
+
, staticRoutes = DataSource.succeed [ {} ]
|
|
304
|
+
, head = head
|
|
305
|
+
, serverless = False
|
|
306
|
+
, handleRoute = \_ _ _ -> DataSource.succeed Nothing
|
|
307
|
+
, kind = "static"
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
{-| -}
|
|
312
|
+
preRender :
|
|
313
|
+
{ data : routeParams -> DataSource data
|
|
314
|
+
, pages : DataSource (List routeParams)
|
|
315
|
+
, head : StaticPayload data action routeParams -> List Head.Tag
|
|
316
|
+
}
|
|
317
|
+
-> Builder routeParams data action
|
|
318
|
+
preRender { data, head, pages } =
|
|
319
|
+
WithData
|
|
320
|
+
{ data = data >> DataSource.map Server.Response.render
|
|
321
|
+
, action = \_ -> DataSource.fail "Internal Error - actions should never be called for statically generated pages."
|
|
322
|
+
, staticRoutes = pages
|
|
323
|
+
, head = head
|
|
324
|
+
, serverless = False
|
|
325
|
+
, handleRoute =
|
|
326
|
+
\moduleContext toRecord routeParams ->
|
|
327
|
+
pages
|
|
328
|
+
|> DataSource.map
|
|
329
|
+
(\allRoutes ->
|
|
330
|
+
if allRoutes |> List.member routeParams then
|
|
331
|
+
Nothing
|
|
332
|
+
|
|
333
|
+
else
|
|
334
|
+
-- TODO pass in toString function, and use a custom one to avoid Debug.toString
|
|
335
|
+
Just <|
|
|
336
|
+
Pages.Internal.NotFoundReason.NotPrerendered
|
|
337
|
+
{ moduleName = moduleContext.moduleName
|
|
338
|
+
, routePattern = moduleContext.routePattern
|
|
339
|
+
, matchedRouteParams = toRecord routeParams
|
|
340
|
+
}
|
|
341
|
+
(allRoutes
|
|
342
|
+
|> List.map toRecord
|
|
343
|
+
)
|
|
344
|
+
)
|
|
345
|
+
, kind = "prerender"
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
{-| -}
|
|
350
|
+
preRenderWithFallback :
|
|
351
|
+
{ data : routeParams -> DataSource (Server.Response.Response data ErrorPage)
|
|
352
|
+
, pages : DataSource (List routeParams)
|
|
353
|
+
, head : StaticPayload data action routeParams -> List Head.Tag
|
|
354
|
+
}
|
|
355
|
+
-> Builder routeParams data action
|
|
356
|
+
preRenderWithFallback { data, head, pages } =
|
|
357
|
+
WithData
|
|
358
|
+
{ data = data
|
|
359
|
+
, action = \_ -> DataSource.fail "Internal Error - actions should never be called for statically generated pages."
|
|
360
|
+
, staticRoutes = pages
|
|
361
|
+
, head = head
|
|
362
|
+
, serverless = False
|
|
363
|
+
, handleRoute =
|
|
364
|
+
\moduleContext toRecord routeParams ->
|
|
365
|
+
DataSource.succeed Nothing
|
|
366
|
+
, kind = "prerender-with-fallback"
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
{-| -}
|
|
371
|
+
serverRender :
|
|
372
|
+
{ data : routeParams -> Server.Request.Parser (DataSource (Server.Response.Response data ErrorPage))
|
|
373
|
+
, action : routeParams -> Server.Request.Parser (DataSource (Server.Response.Response action ErrorPage))
|
|
374
|
+
, head : StaticPayload data action routeParams -> List Head.Tag
|
|
375
|
+
}
|
|
376
|
+
-> Builder routeParams data action
|
|
377
|
+
serverRender { data, action, head } =
|
|
378
|
+
WithData
|
|
379
|
+
{ data =
|
|
380
|
+
\routeParams ->
|
|
381
|
+
DataSource.Http.get
|
|
382
|
+
"$$elm-pages$$headers"
|
|
383
|
+
(routeParams
|
|
384
|
+
|> data
|
|
385
|
+
|> Server.Request.getDecoder
|
|
386
|
+
)
|
|
387
|
+
|> DataSource.andThen
|
|
388
|
+
(\rendered ->
|
|
389
|
+
case rendered of
|
|
390
|
+
Ok okRendered ->
|
|
391
|
+
okRendered
|
|
392
|
+
|
|
393
|
+
Err error ->
|
|
394
|
+
Server.Request.errorsToString error |> DataSource.fail
|
|
395
|
+
)
|
|
396
|
+
, action =
|
|
397
|
+
\routeParams ->
|
|
398
|
+
DataSource.Http.get
|
|
399
|
+
"$$elm-pages$$headers"
|
|
400
|
+
(routeParams
|
|
401
|
+
|> action
|
|
402
|
+
|> Server.Request.getDecoder
|
|
403
|
+
)
|
|
404
|
+
|> DataSource.andThen
|
|
405
|
+
(\rendered ->
|
|
406
|
+
case rendered of
|
|
407
|
+
Ok okRendered ->
|
|
408
|
+
okRendered
|
|
409
|
+
|
|
410
|
+
Err error ->
|
|
411
|
+
Server.Request.errorsToString error |> DataSource.fail
|
|
412
|
+
)
|
|
413
|
+
, staticRoutes = DataSource.succeed []
|
|
414
|
+
, head = head
|
|
415
|
+
, serverless = True
|
|
416
|
+
, handleRoute =
|
|
417
|
+
\moduleContext toRecord routeParams ->
|
|
418
|
+
DataSource.succeed Nothing
|
|
419
|
+
, kind = "serverless"
|
|
420
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module SharedTemplate exposing (SharedTemplate)
|
|
2
2
|
|
|
3
|
-
import Browser.Navigation
|
|
4
3
|
import DataSource
|
|
4
|
+
import Effect exposing (Effect)
|
|
5
5
|
import Html exposing (Html)
|
|
6
6
|
import Pages.Flags exposing (Flags)
|
|
7
7
|
import Pages.PageUrl exposing (PageUrl)
|
|
@@ -12,8 +12,7 @@ import View exposing (View)
|
|
|
12
12
|
|
|
13
13
|
type alias SharedTemplate msg sharedModel sharedData mappedMsg =
|
|
14
14
|
{ init :
|
|
15
|
-
|
|
16
|
-
-> Flags
|
|
15
|
+
Flags
|
|
17
16
|
->
|
|
18
17
|
Maybe
|
|
19
18
|
{ path :
|
|
@@ -24,8 +23,8 @@ type alias SharedTemplate msg sharedModel sharedData mappedMsg =
|
|
|
24
23
|
, metadata : Maybe Route
|
|
25
24
|
, pageUrl : Maybe PageUrl
|
|
26
25
|
}
|
|
27
|
-
-> ( sharedModel,
|
|
28
|
-
, update : msg -> sharedModel -> ( sharedModel,
|
|
26
|
+
-> ( sharedModel, Effect msg )
|
|
27
|
+
, update : msg -> sharedModel -> ( sharedModel, Effect msg )
|
|
29
28
|
, view :
|
|
30
29
|
sharedData
|
|
31
30
|
->
|
|
@@ -2,15 +2,9 @@ module SiteConfig exposing (SiteConfig)
|
|
|
2
2
|
|
|
3
3
|
import DataSource exposing (DataSource)
|
|
4
4
|
import Head
|
|
5
|
-
import Pages.Manifest
|
|
6
|
-
import Route exposing (Route)
|
|
7
5
|
|
|
8
6
|
|
|
9
|
-
type alias SiteConfig
|
|
10
|
-
{
|
|
11
|
-
,
|
|
12
|
-
, manifest : data -> Pages.Manifest.Config
|
|
13
|
-
, head :
|
|
14
|
-
data
|
|
15
|
-
-> List Head.Tag
|
|
7
|
+
type alias SiteConfig =
|
|
8
|
+
{ canonicalUrl : String
|
|
9
|
+
, head : DataSource (List Head.Tag)
|
|
16
10
|
}
|