elm-pages 3.0.0-beta.3 → 3.0.0-beta.31
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} +2864 -2589
- 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 +1447 -342
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16458 -13724
- 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 +4 -4
- package/generator/dead-code-review/elm.json +9 -7
- package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +59 -10
- package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +52 -36
- 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/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 +1447 -342
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +24542 -21748
- 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 +4 -4
- package/generator/review/elm.json +10 -10
- package/generator/src/RouteBuilder.elm +113 -107
- 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 +125 -88
- package/generator/src/cli.js +273 -88
- package/generator/src/codegen.js +29 -27
- package/generator/src/compatibility-key.js +3 -0
- package/generator/src/compile-elm.js +43 -26
- package/generator/src/config.js +39 -0
- package/generator/src/copy-dir.js +2 -2
- package/generator/src/dev-server.js +150 -133
- 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 +23 -22
- package/generator/src/init.js +9 -8
- package/generator/src/pre-render-html.js +39 -28
- package/generator/src/render-test.js +109 -0
- package/generator/src/render-worker.js +25 -28
- package/generator/src/render.js +320 -142
- package/generator/src/request-cache.js +252 -163
- package/generator/src/resolve-elm-module.js +63 -0
- package/generator/src/rewrite-client-elm-json.js +6 -5
- package/generator/src/rewrite-elm-json-help.js +56 -0
- package/generator/src/rewrite-elm-json.js +17 -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 +79 -13
- package/generator/template/app/Api.elm +6 -5
- package/generator/template/app/Effect.elm +123 -0
- package/generator/template/app/ErrorPage.elm +37 -6
- package/generator/template/app/Route/Index.elm +17 -10
- package/generator/template/app/Shared.elm +24 -47
- package/generator/template/app/Site.elm +19 -6
- package/generator/template/app/View.elm +1 -8
- package/generator/template/elm-tooling.json +0 -3
- package/generator/template/elm.json +32 -24
- package/generator/template/package.json +10 -4
- package/package.json +29 -27
- package/src/ApiRoute.elm +199 -61
- package/src/BackendTask/Custom.elm +325 -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 +21 -9
- package/src/Form/FieldView.elm +94 -14
- package/src/Form.elm +275 -400
- 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/FormState.elm +6 -5
- 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/{Msg.elm → Internal/Msg.elm} +26 -16
- package/src/Pages/Internal/Platform/Cli.elm +598 -763
- 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 +216 -102
- 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/PageUrl.elm +23 -9
- package/src/Pages/ProgramConfig.elm +14 -10
- 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/PagesMsg.elm +92 -0
- package/src/Path.elm +16 -19
- package/src/QueryParams.elm +21 -172
- package/src/RequestsAndPending.elm +8 -19
- package/src/Result/Extra.elm +26 -0
- package/src/Scaffold/Form.elm +560 -0
- package/src/Scaffold/Route.elm +1388 -0
- package/src/Server/Request.elm +43 -37
- package/src/Server/Session.elm +62 -42
- package/src/Server/SetCookie.elm +12 -4
- package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
- 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
- package/src/Pages/Generate.elm +0 -800
|
@@ -75,7 +75,7 @@ console.elmlog = (str) => logs.push(str + "\n");
|
|
|
75
75
|
const { Elm } = require("./Runner.elm.js");
|
|
76
76
|
|
|
77
77
|
// Start the Elm app
|
|
78
|
-
const flags = { initialSeed:
|
|
78
|
+
const flags = { initialSeed: 3355512856, fuzzRuns: 100, filter: null };
|
|
79
79
|
const app = Elm.Runner.init({ flags: flags });
|
|
80
80
|
|
|
81
81
|
// Record the timing at which we received the last "runTest" message
|
|
@@ -75,19 +75,19 @@ let testsCount, todoTests;
|
|
|
75
75
|
let reporter;
|
|
76
76
|
let runners = [];
|
|
77
77
|
let working = false;
|
|
78
|
-
let workersCount =
|
|
78
|
+
let workersCount = 10;
|
|
79
79
|
let startWorkCallback = function(){};
|
|
80
80
|
const verbosity = 0;
|
|
81
81
|
|
|
82
82
|
// Create a long lived reporter worker
|
|
83
83
|
const { Elm } = require("./Reporter.elm.js");
|
|
84
84
|
const flags = {
|
|
85
|
-
initialSeed:
|
|
85
|
+
initialSeed: 3355512856,
|
|
86
86
|
fuzzRuns: 100,
|
|
87
|
-
mode: "
|
|
87
|
+
mode: "consoleColor",
|
|
88
88
|
verbosity: verbosity,
|
|
89
89
|
globs: [],
|
|
90
|
-
paths: ["/
|
|
90
|
+
paths: ["/Users/dillonkearns/src/github.com/dillonkearns/elm-pages-v3-beta/generator/review/tests/Pages/Review/NoContractViolationsTest.elm"],
|
|
91
91
|
};
|
|
92
92
|
reporter = Elm.Reporter.init({ flags: flags });
|
|
93
93
|
|
|
@@ -9,26 +9,26 @@
|
|
|
9
9
|
"direct": {
|
|
10
10
|
"elm/core": "1.0.5",
|
|
11
11
|
"elm/html": "1.0.0",
|
|
12
|
+
"elm/json": "1.1.3",
|
|
12
13
|
"elm/regex": "1.0.0",
|
|
13
|
-
"elm-
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"stil4m/elm-syntax": "7.2.5",
|
|
14
|
+
"jfmengels/elm-review": "2.12.2",
|
|
15
|
+
"mdgriffith/elm-codegen": "3.0.0",
|
|
16
|
+
"stil4m/elm-syntax": "7.2.9",
|
|
17
17
|
"the-sett/elm-syntax-dsl": "6.0.2"
|
|
18
18
|
},
|
|
19
19
|
"indirect": {
|
|
20
20
|
"Chadtech/elm-bool-extra": "2.4.2",
|
|
21
|
-
"elm/
|
|
21
|
+
"elm/bytes": "1.0.8",
|
|
22
22
|
"elm/parser": "1.1.0",
|
|
23
23
|
"elm/project-metadata-utils": "1.0.2",
|
|
24
24
|
"elm/random": "1.0.0",
|
|
25
25
|
"elm/time": "1.0.0",
|
|
26
|
-
"elm/virtual-dom": "1.0.
|
|
26
|
+
"elm/virtual-dom": "1.0.3",
|
|
27
27
|
"elm-community/basics-extra": "4.1.0",
|
|
28
|
-
"elm-community/list-extra": "8.
|
|
28
|
+
"elm-community/list-extra": "8.7.0",
|
|
29
29
|
"elm-community/maybe-extra": "5.3.0",
|
|
30
|
-
"elm-explorations/test": "1.
|
|
31
|
-
"miniBill/elm-unicode": "1.0.
|
|
30
|
+
"elm-explorations/test": "2.1.1",
|
|
31
|
+
"miniBill/elm-unicode": "1.0.3",
|
|
32
32
|
"rtfeldman/elm-hex": "1.0.0",
|
|
33
33
|
"stil4m/structured-writer": "1.0.3",
|
|
34
34
|
"the-sett/elm-pretty-printer": "3.0.0"
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
},
|
|
37
37
|
"test-dependencies": {
|
|
38
38
|
"direct": {
|
|
39
|
-
"elm-explorations/test": "1.
|
|
39
|
+
"elm-explorations/test": "2.1.1"
|
|
40
40
|
},
|
|
41
41
|
"indirect": {}
|
|
42
42
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module RouteBuilder exposing
|
|
2
2
|
( StatelessRoute, buildNoState
|
|
3
|
-
,
|
|
3
|
+
, App
|
|
4
4
|
, withOnAction
|
|
5
5
|
, buildWithLocalState, buildWithSharedState
|
|
6
6
|
, preRender, single
|
|
@@ -14,7 +14,7 @@ module RouteBuilder exposing
|
|
|
14
14
|
|
|
15
15
|
## Stateless Route Modules
|
|
16
16
|
|
|
17
|
-
The simplest Route Module you can build is one with no state. It still can use `
|
|
17
|
+
The simplest Route Module you can build is one with no state. It still can use `BackendTask`'s, but it has no `init`, `update`, or `subscriptions`.
|
|
18
18
|
|
|
19
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
20
|
|
|
@@ -25,7 +25,7 @@ If you need to _change_ Shared state, use `buildWithSharedState`.
|
|
|
25
25
|
|
|
26
26
|
## Accessing Static Data
|
|
27
27
|
|
|
28
|
-
With `elm-pages`, you can have HTTP data available before a page is loaded, or read in a file, etc, using the
|
|
28
|
+
With `elm-pages`, you can have HTTP data available before a page is loaded, or read in a file, etc, using the BackendTask API. Since the data
|
|
29
29
|
is available when the page is pre-rendered (as well as in the hydrated page), this is called Static Data.
|
|
30
30
|
|
|
31
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.
|
|
@@ -33,11 +33,11 @@ An example of dynamic data would be keyboard input from the user, query params,
|
|
|
33
33
|
We have the following data during pre-render:
|
|
34
34
|
|
|
35
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 `
|
|
36
|
+
- `data` - this will be the resolved `BackendTask` for our page.
|
|
37
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
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
39
|
|
|
40
|
-
@docs
|
|
40
|
+
@docs App
|
|
41
41
|
|
|
42
42
|
@docs withOnAction
|
|
43
43
|
|
|
@@ -65,7 +65,7 @@ When there are Dynamic Route Segments, you need to tell `elm-pages` which pages
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
pages =
|
|
68
|
-
|
|
68
|
+
BackendTask.succeed
|
|
69
69
|
[ { slug = "blog-post1" }
|
|
70
70
|
, { slug = "blog-post2" }
|
|
71
71
|
]
|
|
@@ -85,21 +85,21 @@ When there are Dynamic Route Segments, you need to tell `elm-pages` which pages
|
|
|
85
85
|
|
|
86
86
|
-}
|
|
87
87
|
|
|
88
|
-
import
|
|
89
|
-
import DataSource exposing (DataSource)
|
|
90
|
-
import DataSource.Http
|
|
88
|
+
import BackendTask exposing (BackendTask)
|
|
91
89
|
import Dict exposing (Dict)
|
|
92
90
|
import Effect exposing (Effect)
|
|
93
91
|
import ErrorPage exposing (ErrorPage)
|
|
92
|
+
import FatalError exposing (FatalError)
|
|
94
93
|
import Head
|
|
95
94
|
import Http
|
|
95
|
+
import Json.Decode
|
|
96
96
|
import Pages.Fetcher
|
|
97
97
|
import Pages.FormState
|
|
98
98
|
import Pages.Internal.NotFoundReason exposing (NotFoundReason)
|
|
99
99
|
import Pages.Internal.RoutePattern exposing (RoutePattern)
|
|
100
|
-
import Pages.Msg
|
|
101
100
|
import Pages.PageUrl exposing (PageUrl)
|
|
102
101
|
import Pages.Transition
|
|
102
|
+
import PagesMsg exposing (PagesMsg)
|
|
103
103
|
import Path exposing (Path)
|
|
104
104
|
import Server.Request
|
|
105
105
|
import Server.Response
|
|
@@ -109,22 +109,21 @@ import View exposing (View)
|
|
|
109
109
|
|
|
110
110
|
{-| -}
|
|
111
111
|
type alias StatefulRoute routeParams data action model msg =
|
|
112
|
-
{ data : routeParams ->
|
|
113
|
-
, action : routeParams ->
|
|
114
|
-
, staticRoutes :
|
|
112
|
+
{ data : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response data ErrorPage)
|
|
113
|
+
, action : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response action ErrorPage)
|
|
114
|
+
, staticRoutes : BackendTask FatalError (List routeParams)
|
|
115
115
|
, view :
|
|
116
|
-
|
|
117
|
-
-> Shared.Model
|
|
116
|
+
Shared.Model
|
|
118
117
|
-> model
|
|
119
|
-
->
|
|
120
|
-
-> View (
|
|
118
|
+
-> App data action routeParams
|
|
119
|
+
-> View (PagesMsg msg)
|
|
121
120
|
, head :
|
|
122
|
-
|
|
121
|
+
App data action routeParams
|
|
123
122
|
-> List Head.Tag
|
|
124
|
-
, init :
|
|
125
|
-
, update :
|
|
126
|
-
, subscriptions :
|
|
127
|
-
, handleRoute : { moduleName : List String, routePattern : RoutePattern } -> (routeParams -> List ( String, String )) -> routeParams ->
|
|
123
|
+
, init : Shared.Model -> App data action routeParams -> ( model, Effect msg )
|
|
124
|
+
, update : App data action routeParams -> msg -> model -> Shared.Model -> ( model, Effect msg, Maybe Shared.Msg )
|
|
125
|
+
, subscriptions : routeParams -> Path -> model -> Shared.Model -> Sub msg
|
|
126
|
+
, handleRoute : { moduleName : List String, routePattern : RoutePattern } -> (routeParams -> List ( String, String )) -> routeParams -> BackendTask FatalError (Maybe NotFoundReason)
|
|
128
127
|
, kind : String
|
|
129
128
|
, onAction : Maybe (action -> msg)
|
|
130
129
|
}
|
|
@@ -136,11 +135,12 @@ type alias StatelessRoute routeParams data action =
|
|
|
136
135
|
|
|
137
136
|
|
|
138
137
|
{-| -}
|
|
139
|
-
type alias
|
|
138
|
+
type alias App data action routeParams =
|
|
140
139
|
{ data : data
|
|
141
140
|
, sharedData : Shared.Data
|
|
142
141
|
, routeParams : routeParams
|
|
143
142
|
, path : Path
|
|
143
|
+
, url : Maybe PageUrl
|
|
144
144
|
, action : Maybe action
|
|
145
145
|
, submit :
|
|
146
146
|
{ fields : List ( String, String ), headers : List ( String, String ) }
|
|
@@ -154,18 +154,18 @@ type alias StaticPayload data action routeParams =
|
|
|
154
154
|
{-| -}
|
|
155
155
|
type Builder routeParams data action
|
|
156
156
|
= WithData
|
|
157
|
-
{ data : routeParams ->
|
|
158
|
-
, action : routeParams ->
|
|
159
|
-
, staticRoutes :
|
|
157
|
+
{ data : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response data ErrorPage)
|
|
158
|
+
, action : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response action ErrorPage)
|
|
159
|
+
, staticRoutes : BackendTask FatalError (List routeParams)
|
|
160
160
|
, head :
|
|
161
|
-
|
|
161
|
+
App data action routeParams
|
|
162
162
|
-> List Head.Tag
|
|
163
163
|
, serverless : Bool
|
|
164
164
|
, handleRoute :
|
|
165
165
|
{ moduleName : List String, routePattern : RoutePattern }
|
|
166
166
|
-> (routeParams -> List ( String, String ))
|
|
167
167
|
-> routeParams
|
|
168
|
-
->
|
|
168
|
+
-> BackendTask FatalError (Maybe NotFoundReason)
|
|
169
169
|
, kind : String
|
|
170
170
|
}
|
|
171
171
|
|
|
@@ -173,24 +173,23 @@ type Builder routeParams data action
|
|
|
173
173
|
{-| -}
|
|
174
174
|
buildNoState :
|
|
175
175
|
{ view :
|
|
176
|
-
|
|
176
|
+
App data action routeParams
|
|
177
177
|
-> Shared.Model
|
|
178
|
-
->
|
|
179
|
-
-> View (Pages.Msg.Msg ())
|
|
178
|
+
-> View (PagesMsg ())
|
|
180
179
|
}
|
|
181
180
|
-> Builder routeParams data action
|
|
182
181
|
-> StatefulRoute routeParams data action {} ()
|
|
183
182
|
buildNoState { view } builderState =
|
|
184
183
|
case builderState of
|
|
185
184
|
WithData record ->
|
|
186
|
-
{ view = \
|
|
185
|
+
{ view = \shared model app -> view app shared
|
|
187
186
|
, head = record.head
|
|
188
187
|
, data = record.data
|
|
189
188
|
, action = record.action
|
|
190
189
|
, staticRoutes = record.staticRoutes
|
|
191
|
-
, init = \_ _
|
|
192
|
-
, update = \_ _ _ _
|
|
193
|
-
, subscriptions = \_ _ _ _
|
|
190
|
+
, init = \_ _ -> ( {}, Effect.none )
|
|
191
|
+
, update = \_ _ _ _ -> ( {}, Effect.none, Nothing )
|
|
192
|
+
, subscriptions = \_ _ _ _ -> Sub.none
|
|
194
193
|
, handleRoute = record.handleRoute
|
|
195
194
|
, kind = record.kind
|
|
196
195
|
, onAction = Nothing
|
|
@@ -208,14 +207,13 @@ withOnAction toMsg config =
|
|
|
208
207
|
{-| -}
|
|
209
208
|
buildWithLocalState :
|
|
210
209
|
{ view :
|
|
211
|
-
|
|
210
|
+
App data action routeParams
|
|
212
211
|
-> Shared.Model
|
|
213
212
|
-> model
|
|
214
|
-
->
|
|
215
|
-
|
|
216
|
-
,
|
|
217
|
-
,
|
|
218
|
-
, subscriptions : Maybe PageUrl -> routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
213
|
+
-> View (PagesMsg msg)
|
|
214
|
+
, init : App data action routeParams -> Shared.Model -> ( model, Effect msg )
|
|
215
|
+
, update : App data action routeParams -> Shared.Model -> msg -> model -> ( model, Effect msg )
|
|
216
|
+
, subscriptions : routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
219
217
|
}
|
|
220
218
|
-> Builder routeParams data action
|
|
221
219
|
-> StatefulRoute routeParams data action model msg
|
|
@@ -223,28 +221,23 @@ buildWithLocalState config builderState =
|
|
|
223
221
|
case builderState of
|
|
224
222
|
WithData record ->
|
|
225
223
|
{ view =
|
|
226
|
-
\model sharedModel
|
|
227
|
-
config.view model sharedModel
|
|
224
|
+
\model sharedModel app ->
|
|
225
|
+
config.view app model sharedModel
|
|
228
226
|
, head = record.head
|
|
229
227
|
, data = record.data
|
|
230
228
|
, action = record.action
|
|
231
229
|
, staticRoutes = record.staticRoutes
|
|
232
|
-
, init = config.init
|
|
230
|
+
, init = \shared app -> config.init app shared
|
|
233
231
|
, update =
|
|
234
|
-
\
|
|
232
|
+
\app msg model sharedModel ->
|
|
235
233
|
let
|
|
236
234
|
( updatedModel, cmd ) =
|
|
237
|
-
config.update
|
|
238
|
-
pageUrl
|
|
239
|
-
sharedModel
|
|
240
|
-
staticPayload
|
|
241
|
-
msg
|
|
242
|
-
model
|
|
235
|
+
config.update app sharedModel msg model
|
|
243
236
|
in
|
|
244
237
|
( updatedModel, cmd, Nothing )
|
|
245
238
|
, subscriptions =
|
|
246
|
-
\
|
|
247
|
-
config.subscriptions
|
|
239
|
+
\routeParams path model sharedModel ->
|
|
240
|
+
config.subscriptions routeParams path sharedModel model
|
|
248
241
|
, handleRoute = record.handleRoute
|
|
249
242
|
, kind = record.kind
|
|
250
243
|
, onAction = Nothing
|
|
@@ -254,36 +247,35 @@ buildWithLocalState config builderState =
|
|
|
254
247
|
{-| -}
|
|
255
248
|
buildWithSharedState :
|
|
256
249
|
{ view :
|
|
257
|
-
|
|
250
|
+
App data action routeParams
|
|
258
251
|
-> Shared.Model
|
|
259
252
|
-> model
|
|
260
|
-
->
|
|
261
|
-
|
|
262
|
-
,
|
|
263
|
-
,
|
|
264
|
-
, subscriptions : Maybe PageUrl -> routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
253
|
+
-> View (PagesMsg msg)
|
|
254
|
+
, init : App data action routeParams -> Shared.Model -> ( model, Effect msg )
|
|
255
|
+
, update : App data action routeParams -> Shared.Model -> msg -> model -> ( model, Effect msg, Maybe Shared.Msg )
|
|
256
|
+
, subscriptions : routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
265
257
|
}
|
|
266
258
|
-> Builder routeParams data action
|
|
267
259
|
-> StatefulRoute routeParams data action model msg
|
|
268
260
|
buildWithSharedState config builderState =
|
|
269
261
|
case builderState of
|
|
270
262
|
WithData record ->
|
|
271
|
-
{ view = config.view
|
|
263
|
+
{ view = \shared model app -> config.view app shared model
|
|
272
264
|
, head = record.head
|
|
273
265
|
, data = record.data
|
|
274
266
|
, action = record.action
|
|
275
267
|
, staticRoutes = record.staticRoutes
|
|
276
|
-
, init = config.init
|
|
268
|
+
, init = \shared app -> config.init app shared
|
|
277
269
|
, update =
|
|
278
|
-
\
|
|
279
|
-
config.update
|
|
270
|
+
\app msg model sharedModel ->
|
|
271
|
+
config.update
|
|
272
|
+
app
|
|
280
273
|
sharedModel
|
|
281
|
-
staticPayload
|
|
282
274
|
msg
|
|
283
275
|
model
|
|
284
276
|
, subscriptions =
|
|
285
|
-
\
|
|
286
|
-
config.subscriptions
|
|
277
|
+
\routeParams path model sharedModel ->
|
|
278
|
+
config.subscriptions routeParams path sharedModel model
|
|
287
279
|
, handleRoute = record.handleRoute
|
|
288
280
|
, kind = record.kind
|
|
289
281
|
, onAction = Nothing
|
|
@@ -292,40 +284,40 @@ buildWithSharedState config builderState =
|
|
|
292
284
|
|
|
293
285
|
{-| -}
|
|
294
286
|
single :
|
|
295
|
-
{ data :
|
|
296
|
-
, head :
|
|
287
|
+
{ data : BackendTask FatalError data
|
|
288
|
+
, head : App data action {} -> List Head.Tag
|
|
297
289
|
}
|
|
298
290
|
-> Builder {} data action
|
|
299
291
|
single { data, head } =
|
|
300
292
|
WithData
|
|
301
|
-
{ data = \_ -> data |>
|
|
302
|
-
, action = \_ ->
|
|
303
|
-
, staticRoutes =
|
|
293
|
+
{ data = \_ _ -> data |> BackendTask.map Server.Response.render
|
|
294
|
+
, action = \_ _ -> BackendTask.fail (FatalError.fromString "Internal Error - actions should never be called for statically generated pages.")
|
|
295
|
+
, staticRoutes = BackendTask.succeed [ {} ]
|
|
304
296
|
, head = head
|
|
305
297
|
, serverless = False
|
|
306
|
-
, handleRoute = \_ _ _ ->
|
|
298
|
+
, handleRoute = \_ _ _ -> BackendTask.succeed Nothing
|
|
307
299
|
, kind = "static"
|
|
308
300
|
}
|
|
309
301
|
|
|
310
302
|
|
|
311
303
|
{-| -}
|
|
312
304
|
preRender :
|
|
313
|
-
{ data : routeParams ->
|
|
314
|
-
, pages :
|
|
315
|
-
, head :
|
|
305
|
+
{ data : routeParams -> BackendTask FatalError data
|
|
306
|
+
, pages : BackendTask FatalError (List routeParams)
|
|
307
|
+
, head : App data action routeParams -> List Head.Tag
|
|
316
308
|
}
|
|
317
309
|
-> Builder routeParams data action
|
|
318
310
|
preRender { data, head, pages } =
|
|
319
311
|
WithData
|
|
320
|
-
{ data = data >>
|
|
321
|
-
, action = \_ ->
|
|
312
|
+
{ data = \_ -> data >> BackendTask.map Server.Response.render
|
|
313
|
+
, action = \_ _ -> BackendTask.fail (FatalError.fromString "Internal Error - actions should never be called for statically generated pages.")
|
|
322
314
|
, staticRoutes = pages
|
|
323
315
|
, head = head
|
|
324
316
|
, serverless = False
|
|
325
317
|
, handleRoute =
|
|
326
318
|
\moduleContext toRecord routeParams ->
|
|
327
319
|
pages
|
|
328
|
-
|>
|
|
320
|
+
|> BackendTask.map
|
|
329
321
|
(\allRoutes ->
|
|
330
322
|
if allRoutes |> List.member routeParams then
|
|
331
323
|
Nothing
|
|
@@ -348,73 +340,87 @@ preRender { data, head, pages } =
|
|
|
348
340
|
|
|
349
341
|
{-| -}
|
|
350
342
|
preRenderWithFallback :
|
|
351
|
-
{ data : routeParams ->
|
|
352
|
-
, pages :
|
|
353
|
-
, head :
|
|
343
|
+
{ data : routeParams -> BackendTask FatalError (Server.Response.Response data ErrorPage)
|
|
344
|
+
, pages : BackendTask FatalError (List routeParams)
|
|
345
|
+
, head : App data action routeParams -> List Head.Tag
|
|
354
346
|
}
|
|
355
347
|
-> Builder routeParams data action
|
|
356
348
|
preRenderWithFallback { data, head, pages } =
|
|
357
349
|
WithData
|
|
358
|
-
{ data = data
|
|
359
|
-
, action = \_ ->
|
|
350
|
+
{ data = \_ -> data
|
|
351
|
+
, action = \_ _ -> BackendTask.fail (FatalError.fromString "Internal Error - actions should never be called for statically generated pages.")
|
|
360
352
|
, staticRoutes = pages
|
|
361
353
|
, head = head
|
|
362
354
|
, serverless = False
|
|
363
355
|
, handleRoute =
|
|
364
356
|
\moduleContext toRecord routeParams ->
|
|
365
|
-
|
|
357
|
+
BackendTask.succeed Nothing
|
|
366
358
|
, kind = "prerender-with-fallback"
|
|
367
359
|
}
|
|
368
360
|
|
|
369
361
|
|
|
370
362
|
{-| -}
|
|
371
363
|
serverRender :
|
|
372
|
-
{ data : routeParams -> Server.Request.Parser (
|
|
373
|
-
, action : routeParams -> Server.Request.Parser (
|
|
374
|
-
, head :
|
|
364
|
+
{ data : routeParams -> Server.Request.Parser (BackendTask FatalError (Server.Response.Response data ErrorPage))
|
|
365
|
+
, action : routeParams -> Server.Request.Parser (BackendTask FatalError (Server.Response.Response action ErrorPage))
|
|
366
|
+
, head : App data action routeParams -> List Head.Tag
|
|
375
367
|
}
|
|
376
368
|
-> Builder routeParams data action
|
|
377
369
|
serverRender { data, action, head } =
|
|
378
370
|
WithData
|
|
379
371
|
{ data =
|
|
380
|
-
\routeParams ->
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
372
|
+
\requestPayload routeParams ->
|
|
373
|
+
(routeParams
|
|
374
|
+
|> data
|
|
375
|
+
|> Server.Request.getDecoder
|
|
376
|
+
|> (\decoder ->
|
|
377
|
+
Json.Decode.decodeValue decoder requestPayload
|
|
378
|
+
|> Result.mapError Json.Decode.errorToString
|
|
379
|
+
|> BackendTask.fromResult
|
|
380
|
+
-- TODO include title and better error context and formatting
|
|
381
|
+
|> BackendTask.onError (\error -> BackendTask.fail (FatalError.fromString error))
|
|
382
|
+
)
|
|
383
|
+
)
|
|
384
|
+
|> BackendTask.andThen
|
|
388
385
|
(\rendered ->
|
|
389
386
|
case rendered of
|
|
390
387
|
Ok okRendered ->
|
|
391
388
|
okRendered
|
|
392
389
|
|
|
393
390
|
Err error ->
|
|
394
|
-
Server.Request.errorsToString error
|
|
391
|
+
Server.Request.errorsToString error
|
|
392
|
+
|> FatalError.fromString
|
|
393
|
+
|> BackendTask.fail
|
|
395
394
|
)
|
|
396
395
|
, action =
|
|
397
|
-
\routeParams ->
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
396
|
+
\requestPayload routeParams ->
|
|
397
|
+
(routeParams
|
|
398
|
+
|> action
|
|
399
|
+
|> Server.Request.getDecoder
|
|
400
|
+
|> (\decoder ->
|
|
401
|
+
Json.Decode.decodeValue decoder requestPayload
|
|
402
|
+
|> Result.mapError Json.Decode.errorToString
|
|
403
|
+
|> BackendTask.fromResult
|
|
404
|
+
-- TODO include title and better error context and formatting
|
|
405
|
+
|> BackendTask.onError (\error -> BackendTask.fail (FatalError.fromString error))
|
|
406
|
+
)
|
|
407
|
+
)
|
|
408
|
+
|> BackendTask.andThen
|
|
405
409
|
(\rendered ->
|
|
406
410
|
case rendered of
|
|
407
411
|
Ok okRendered ->
|
|
408
412
|
okRendered
|
|
409
413
|
|
|
410
414
|
Err error ->
|
|
411
|
-
Server.Request.errorsToString error
|
|
415
|
+
Server.Request.errorsToString error
|
|
416
|
+
|> FatalError.fromString
|
|
417
|
+
|> BackendTask.fail
|
|
412
418
|
)
|
|
413
|
-
, staticRoutes =
|
|
419
|
+
, staticRoutes = BackendTask.succeed []
|
|
414
420
|
, head = head
|
|
415
421
|
, serverless = True
|
|
416
422
|
, handleRoute =
|
|
417
423
|
\moduleContext toRecord routeParams ->
|
|
418
|
-
|
|
424
|
+
BackendTask.succeed Nothing
|
|
419
425
|
, kind = "serverless"
|
|
420
426
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
module SharedTemplate exposing (SharedTemplate)
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import BackendTask
|
|
4
4
|
import Effect exposing (Effect)
|
|
5
|
+
import FatalError exposing (FatalError)
|
|
5
6
|
import Html exposing (Html)
|
|
6
7
|
import Pages.Flags exposing (Flags)
|
|
7
8
|
import Pages.PageUrl exposing (PageUrl)
|
|
@@ -35,7 +36,7 @@ type alias SharedTemplate msg sharedModel sharedData mappedMsg =
|
|
|
35
36
|
-> (msg -> mappedMsg)
|
|
36
37
|
-> View mappedMsg
|
|
37
38
|
-> { body : List (Html mappedMsg), title : String }
|
|
38
|
-
, data :
|
|
39
|
+
, data : BackendTask.BackendTask FatalError sharedData
|
|
39
40
|
, subscriptions : Path -> sharedModel -> Sub msg
|
|
40
41
|
, onPageChange :
|
|
41
42
|
Maybe
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
module SiteConfig exposing (SiteConfig)
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import BackendTask exposing (BackendTask)
|
|
4
|
+
import FatalError exposing (FatalError)
|
|
4
5
|
import Head
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
type alias SiteConfig =
|
|
8
9
|
{ canonicalUrl : String
|
|
9
|
-
, head :
|
|
10
|
+
, head : BackendTask FatalError (List Head.Tag)
|
|
10
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// this middleware is only active when (config.base !== '/')
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
export function baseMiddleware(base) {
|
|
4
4
|
// Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...`
|
|
5
5
|
return function viteBaseMiddleware(req, res, next) {
|
|
6
6
|
// `req.url` only contains the path, since that is what gets passed in the HTTP request.
|
|
@@ -34,11 +34,11 @@ module.exports = function baseMiddleware(base) {
|
|
|
34
34
|
const suggestionUrl = `${base}/${path.slice(1)}`;
|
|
35
35
|
res.end(
|
|
36
36
|
`The server is configured with a public base URL of ${base} - ` +
|
|
37
|
-
|
|
37
|
+
`did you mean to visit ${suggestionUrl} instead?`
|
|
38
38
|
);
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
next();
|
|
43
43
|
};
|
|
44
|
-
}
|
|
44
|
+
}
|