elm-pages 3.0.0-beta.4 → 3.0.0-beta.41
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/adapter/netlify.js +207 -0
- package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2828 -2933
- 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 +17004 -13817
- 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 +25025 -21739
- 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 +121 -114
- package/generator/src/SharedTemplate.elm +8 -7
- package/generator/src/SiteConfig.elm +3 -2
- package/generator/src/basepath-middleware.js +3 -3
- package/generator/src/build.js +209 -92
- package/generator/src/cli.js +292 -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 +176 -138
- 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 -23
- 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 +321 -142
- package/generator/src/request-cache.js +265 -162
- package/generator/src/resolve-elm-module.js +64 -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/elm-pages.js +10 -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 +30 -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 +171 -56
- package/src/{DataSource → BackendTask}/Glob.elm +136 -125
- package/src/BackendTask/Http.elm +679 -0
- package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
- package/src/BackendTask/Internal/Request.elm +69 -0
- package/src/BackendTask/Random.elm +79 -0
- package/src/BackendTask/Time.elm +47 -0
- package/src/BackendTask.elm +531 -0
- package/src/FatalError.elm +90 -0
- package/src/Head/Seo.elm +4 -4
- package/src/Head.elm +237 -7
- package/src/HtmlPrinter.elm +7 -3
- package/src/Internal/ApiRoute.elm +7 -5
- package/src/PageServerResponse.elm +6 -1
- package/src/Pages/ConcurrentSubmission.elm +127 -0
- package/src/Pages/Form.elm +340 -0
- package/src/Pages/FormData.elm +18 -0
- package/src/Pages/GeneratorProgramConfig.elm +15 -0
- package/src/Pages/Internal/FatalError.elm +5 -0
- package/src/Pages/Internal/Msg.elm +93 -0
- package/src/Pages/Internal/NotFoundReason.elm +4 -4
- package/src/Pages/Internal/Platform/Cli.elm +617 -768
- 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 +379 -0
- package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
- package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
- package/src/Pages/Internal/Platform.elm +359 -225
- package/src/Pages/Internal/ResponseSketch.elm +2 -2
- package/src/Pages/Internal/Script.elm +17 -0
- package/src/Pages/Internal/StaticHttpBody.elm +35 -1
- package/src/Pages/Manifest.elm +52 -11
- package/src/Pages/Navigation.elm +87 -0
- package/src/Pages/PageUrl.elm +26 -12
- package/src/Pages/ProgramConfig.elm +35 -23
- package/src/Pages/Script.elm +166 -0
- package/src/Pages/SiteConfig.elm +3 -2
- package/src/Pages/StaticHttp/Request.elm +2 -2
- package/src/Pages/StaticHttpRequest.elm +23 -99
- package/src/Pages/Url.elm +3 -3
- package/src/PagesMsg.elm +88 -0
- package/src/QueryParams.elm +21 -172
- package/src/RenderRequest.elm +7 -7
- package/src/RequestsAndPending.elm +37 -20
- package/src/Result/Extra.elm +26 -0
- package/src/Scaffold/Form.elm +569 -0
- package/src/Scaffold/Route.elm +1411 -0
- package/src/Server/Request.elm +74 -72
- package/src/Server/Session.elm +62 -42
- package/src/Server/SetCookie.elm +80 -32
- package/src/Stub.elm +53 -0
- package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
- package/src/{Path.elm → UrlPath.elm} +33 -36
- 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/Form/Field.elm +0 -717
- package/src/Form/FieldStatus.elm +0 -36
- package/src/Form/FieldView.elm +0 -417
- package/src/Form/FormData.elm +0 -22
- package/src/Form/Validation.elm +0 -391
- package/src/Form/Value.elm +0 -118
- package/src/Form.elm +0 -1683
- package/src/FormDecoder.elm +0 -102
- package/src/Pages/FormState.elm +0 -256
- package/src/Pages/Generate.elm +0 -800
- package/src/Pages/Internal/Form.elm +0 -17
- package/src/Pages/Msg.elm +0 -79
- package/src/Pages/Transition.elm +0 -70
|
@@ -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: 4127127384, 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: 4127127384,
|
|
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.13.0",
|
|
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,22 +85,23 @@ 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)
|
|
93
|
+
import Form
|
|
94
94
|
import Head
|
|
95
95
|
import Http
|
|
96
|
+
import Json.Decode
|
|
97
|
+
import Pages.ConcurrentSubmission
|
|
96
98
|
import Pages.Fetcher
|
|
97
|
-
import Pages.FormState
|
|
98
99
|
import Pages.Internal.NotFoundReason exposing (NotFoundReason)
|
|
99
100
|
import Pages.Internal.RoutePattern exposing (RoutePattern)
|
|
100
|
-
import Pages.Msg
|
|
101
101
|
import Pages.PageUrl exposing (PageUrl)
|
|
102
|
-
import Pages.
|
|
103
|
-
import
|
|
102
|
+
import Pages.Navigation
|
|
103
|
+
import PagesMsg exposing (PagesMsg)
|
|
104
|
+
import UrlPath exposing (UrlPath)
|
|
104
105
|
import Server.Request
|
|
105
106
|
import Server.Response
|
|
106
107
|
import Shared
|
|
@@ -109,22 +110,21 @@ import View exposing (View)
|
|
|
109
110
|
|
|
110
111
|
{-| -}
|
|
111
112
|
type alias StatefulRoute routeParams data action model msg =
|
|
112
|
-
{ data : routeParams ->
|
|
113
|
-
, action : routeParams ->
|
|
114
|
-
, staticRoutes :
|
|
113
|
+
{ data : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response data ErrorPage)
|
|
114
|
+
, action : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response action ErrorPage)
|
|
115
|
+
, staticRoutes : BackendTask FatalError (List routeParams)
|
|
115
116
|
, view :
|
|
116
|
-
|
|
117
|
-
-> Shared.Model
|
|
117
|
+
Shared.Model
|
|
118
118
|
-> model
|
|
119
|
-
->
|
|
120
|
-
-> View (
|
|
119
|
+
-> App data action routeParams
|
|
120
|
+
-> View (PagesMsg msg)
|
|
121
121
|
, head :
|
|
122
|
-
|
|
122
|
+
App data action routeParams
|
|
123
123
|
-> List Head.Tag
|
|
124
|
-
, init :
|
|
125
|
-
, update :
|
|
126
|
-
, subscriptions :
|
|
127
|
-
, handleRoute : { moduleName : List String, routePattern : RoutePattern } -> (routeParams -> List ( String, String )) -> routeParams ->
|
|
124
|
+
, init : Shared.Model -> App data action routeParams -> ( model, Effect msg )
|
|
125
|
+
, update : App data action routeParams -> msg -> model -> Shared.Model -> ( model, Effect msg, Maybe Shared.Msg )
|
|
126
|
+
, subscriptions : routeParams -> UrlPath -> model -> Shared.Model -> Sub msg
|
|
127
|
+
, handleRoute : { moduleName : List String, routePattern : RoutePattern } -> (routeParams -> List ( String, String )) -> routeParams -> BackendTask FatalError (Maybe NotFoundReason)
|
|
128
128
|
, kind : String
|
|
129
129
|
, onAction : Maybe (action -> msg)
|
|
130
130
|
}
|
|
@@ -136,36 +136,37 @@ type alias StatelessRoute routeParams data action =
|
|
|
136
136
|
|
|
137
137
|
|
|
138
138
|
{-| -}
|
|
139
|
-
type alias
|
|
139
|
+
type alias App data action routeParams =
|
|
140
140
|
{ data : data
|
|
141
141
|
, sharedData : Shared.Data
|
|
142
142
|
, routeParams : routeParams
|
|
143
|
-
, path :
|
|
143
|
+
, path : UrlPath
|
|
144
|
+
, url : Maybe PageUrl
|
|
144
145
|
, action : Maybe action
|
|
145
146
|
, submit :
|
|
146
147
|
{ fields : List ( String, String ), headers : List ( String, String ) }
|
|
147
148
|
-> Pages.Fetcher.Fetcher (Result Http.Error action)
|
|
148
|
-
,
|
|
149
|
-
,
|
|
150
|
-
, pageFormState :
|
|
149
|
+
, navigation : Maybe Pages.Navigation.Navigation
|
|
150
|
+
, concurrentSubmissions : Dict String (Pages.ConcurrentSubmission.ConcurrentSubmission (Maybe action))
|
|
151
|
+
, pageFormState : Form.Model
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
|
|
154
155
|
{-| -}
|
|
155
156
|
type Builder routeParams data action
|
|
156
157
|
= WithData
|
|
157
|
-
{ data : routeParams ->
|
|
158
|
-
, action : routeParams ->
|
|
159
|
-
, staticRoutes :
|
|
158
|
+
{ data : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response data ErrorPage)
|
|
159
|
+
, action : Json.Decode.Value -> routeParams -> BackendTask FatalError (Server.Response.Response action ErrorPage)
|
|
160
|
+
, staticRoutes : BackendTask FatalError (List routeParams)
|
|
160
161
|
, head :
|
|
161
|
-
|
|
162
|
+
App data action routeParams
|
|
162
163
|
-> List Head.Tag
|
|
163
164
|
, serverless : Bool
|
|
164
165
|
, handleRoute :
|
|
165
166
|
{ moduleName : List String, routePattern : RoutePattern }
|
|
166
167
|
-> (routeParams -> List ( String, String ))
|
|
167
168
|
-> routeParams
|
|
168
|
-
->
|
|
169
|
+
-> BackendTask FatalError (Maybe NotFoundReason)
|
|
169
170
|
, kind : String
|
|
170
171
|
}
|
|
171
172
|
|
|
@@ -173,24 +174,23 @@ type Builder routeParams data action
|
|
|
173
174
|
{-| -}
|
|
174
175
|
buildNoState :
|
|
175
176
|
{ view :
|
|
176
|
-
|
|
177
|
+
App data action routeParams
|
|
177
178
|
-> Shared.Model
|
|
178
|
-
->
|
|
179
|
-
-> View (Pages.Msg.Msg ())
|
|
179
|
+
-> View (PagesMsg ())
|
|
180
180
|
}
|
|
181
181
|
-> Builder routeParams data action
|
|
182
182
|
-> StatefulRoute routeParams data action {} ()
|
|
183
183
|
buildNoState { view } builderState =
|
|
184
184
|
case builderState of
|
|
185
185
|
WithData record ->
|
|
186
|
-
{ view = \
|
|
186
|
+
{ view = \shared model app -> view app shared
|
|
187
187
|
, head = record.head
|
|
188
188
|
, data = record.data
|
|
189
189
|
, action = record.action
|
|
190
190
|
, staticRoutes = record.staticRoutes
|
|
191
|
-
, init = \_ _
|
|
192
|
-
, update = \_ _ _ _
|
|
193
|
-
, subscriptions = \_ _ _ _
|
|
191
|
+
, init = \_ _ -> ( {}, Effect.none )
|
|
192
|
+
, update = \_ _ _ _ -> ( {}, Effect.none, Nothing )
|
|
193
|
+
, subscriptions = \_ _ _ _ -> Sub.none
|
|
194
194
|
, handleRoute = record.handleRoute
|
|
195
195
|
, kind = record.kind
|
|
196
196
|
, onAction = Nothing
|
|
@@ -208,14 +208,13 @@ withOnAction toMsg config =
|
|
|
208
208
|
{-| -}
|
|
209
209
|
buildWithLocalState :
|
|
210
210
|
{ view :
|
|
211
|
-
|
|
211
|
+
App data action routeParams
|
|
212
212
|
-> Shared.Model
|
|
213
213
|
-> model
|
|
214
|
-
->
|
|
215
|
-
|
|
216
|
-
,
|
|
217
|
-
,
|
|
218
|
-
, subscriptions : Maybe PageUrl -> routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
214
|
+
-> View (PagesMsg msg)
|
|
215
|
+
, init : App data action routeParams -> Shared.Model -> ( model, Effect msg )
|
|
216
|
+
, update : App data action routeParams -> Shared.Model -> msg -> model -> ( model, Effect msg )
|
|
217
|
+
, subscriptions : routeParams -> UrlPath -> Shared.Model -> model -> Sub msg
|
|
219
218
|
}
|
|
220
219
|
-> Builder routeParams data action
|
|
221
220
|
-> StatefulRoute routeParams data action model msg
|
|
@@ -223,28 +222,23 @@ buildWithLocalState config builderState =
|
|
|
223
222
|
case builderState of
|
|
224
223
|
WithData record ->
|
|
225
224
|
{ view =
|
|
226
|
-
\model sharedModel
|
|
227
|
-
config.view model sharedModel
|
|
225
|
+
\model sharedModel app ->
|
|
226
|
+
config.view app model sharedModel
|
|
228
227
|
, head = record.head
|
|
229
228
|
, data = record.data
|
|
230
229
|
, action = record.action
|
|
231
230
|
, staticRoutes = record.staticRoutes
|
|
232
|
-
, init = config.init
|
|
231
|
+
, init = \shared app -> config.init app shared
|
|
233
232
|
, update =
|
|
234
|
-
\
|
|
233
|
+
\app msg model sharedModel ->
|
|
235
234
|
let
|
|
236
235
|
( updatedModel, cmd ) =
|
|
237
|
-
config.update
|
|
238
|
-
pageUrl
|
|
239
|
-
sharedModel
|
|
240
|
-
staticPayload
|
|
241
|
-
msg
|
|
242
|
-
model
|
|
236
|
+
config.update app sharedModel msg model
|
|
243
237
|
in
|
|
244
238
|
( updatedModel, cmd, Nothing )
|
|
245
239
|
, subscriptions =
|
|
246
|
-
\
|
|
247
|
-
config.subscriptions
|
|
240
|
+
\routeParams path model sharedModel ->
|
|
241
|
+
config.subscriptions routeParams path sharedModel model
|
|
248
242
|
, handleRoute = record.handleRoute
|
|
249
243
|
, kind = record.kind
|
|
250
244
|
, onAction = Nothing
|
|
@@ -254,36 +248,35 @@ buildWithLocalState config builderState =
|
|
|
254
248
|
{-| -}
|
|
255
249
|
buildWithSharedState :
|
|
256
250
|
{ view :
|
|
257
|
-
|
|
251
|
+
App data action routeParams
|
|
258
252
|
-> Shared.Model
|
|
259
253
|
-> model
|
|
260
|
-
->
|
|
261
|
-
|
|
262
|
-
,
|
|
263
|
-
,
|
|
264
|
-
, subscriptions : Maybe PageUrl -> routeParams -> Path -> Shared.Model -> model -> Sub msg
|
|
254
|
+
-> View (PagesMsg msg)
|
|
255
|
+
, init : App data action routeParams -> Shared.Model -> ( model, Effect msg )
|
|
256
|
+
, update : App data action routeParams -> Shared.Model -> msg -> model -> ( model, Effect msg, Maybe Shared.Msg )
|
|
257
|
+
, subscriptions : routeParams -> UrlPath -> Shared.Model -> model -> Sub msg
|
|
265
258
|
}
|
|
266
259
|
-> Builder routeParams data action
|
|
267
260
|
-> StatefulRoute routeParams data action model msg
|
|
268
261
|
buildWithSharedState config builderState =
|
|
269
262
|
case builderState of
|
|
270
263
|
WithData record ->
|
|
271
|
-
{ view = config.view
|
|
264
|
+
{ view = \shared model app -> config.view app shared model
|
|
272
265
|
, head = record.head
|
|
273
266
|
, data = record.data
|
|
274
267
|
, action = record.action
|
|
275
268
|
, staticRoutes = record.staticRoutes
|
|
276
|
-
, init = config.init
|
|
269
|
+
, init = \shared app -> config.init app shared
|
|
277
270
|
, update =
|
|
278
|
-
\
|
|
279
|
-
config.update
|
|
271
|
+
\app msg model sharedModel ->
|
|
272
|
+
config.update
|
|
273
|
+
app
|
|
280
274
|
sharedModel
|
|
281
|
-
staticPayload
|
|
282
275
|
msg
|
|
283
276
|
model
|
|
284
277
|
, subscriptions =
|
|
285
|
-
\
|
|
286
|
-
config.subscriptions
|
|
278
|
+
\routeParams path model sharedModel ->
|
|
279
|
+
config.subscriptions routeParams path sharedModel model
|
|
287
280
|
, handleRoute = record.handleRoute
|
|
288
281
|
, kind = record.kind
|
|
289
282
|
, onAction = Nothing
|
|
@@ -292,40 +285,40 @@ buildWithSharedState config builderState =
|
|
|
292
285
|
|
|
293
286
|
{-| -}
|
|
294
287
|
single :
|
|
295
|
-
{ data :
|
|
296
|
-
, head :
|
|
288
|
+
{ data : BackendTask FatalError data
|
|
289
|
+
, head : App data action {} -> List Head.Tag
|
|
297
290
|
}
|
|
298
291
|
-> Builder {} data action
|
|
299
292
|
single { data, head } =
|
|
300
293
|
WithData
|
|
301
|
-
{ data = \_ -> data |>
|
|
302
|
-
, action = \_ ->
|
|
303
|
-
, staticRoutes =
|
|
294
|
+
{ data = \_ _ -> data |> BackendTask.map Server.Response.render
|
|
295
|
+
, action = \_ _ -> BackendTask.fail (FatalError.fromString "Internal Error - actions should never be called for statically generated pages.")
|
|
296
|
+
, staticRoutes = BackendTask.succeed [ {} ]
|
|
304
297
|
, head = head
|
|
305
298
|
, serverless = False
|
|
306
|
-
, handleRoute = \_ _ _ ->
|
|
299
|
+
, handleRoute = \_ _ _ -> BackendTask.succeed Nothing
|
|
307
300
|
, kind = "static"
|
|
308
301
|
}
|
|
309
302
|
|
|
310
303
|
|
|
311
304
|
{-| -}
|
|
312
305
|
preRender :
|
|
313
|
-
{ data : routeParams ->
|
|
314
|
-
, pages :
|
|
315
|
-
, head :
|
|
306
|
+
{ data : routeParams -> BackendTask FatalError data
|
|
307
|
+
, pages : BackendTask FatalError (List routeParams)
|
|
308
|
+
, head : App data action routeParams -> List Head.Tag
|
|
316
309
|
}
|
|
317
310
|
-> Builder routeParams data action
|
|
318
311
|
preRender { data, head, pages } =
|
|
319
312
|
WithData
|
|
320
|
-
{ data = data >>
|
|
321
|
-
, action = \_ ->
|
|
313
|
+
{ data = \_ -> data >> BackendTask.map Server.Response.render
|
|
314
|
+
, action = \_ _ -> BackendTask.fail (FatalError.fromString "Internal Error - actions should never be called for statically generated pages.")
|
|
322
315
|
, staticRoutes = pages
|
|
323
316
|
, head = head
|
|
324
317
|
, serverless = False
|
|
325
318
|
, handleRoute =
|
|
326
319
|
\moduleContext toRecord routeParams ->
|
|
327
320
|
pages
|
|
328
|
-
|>
|
|
321
|
+
|> BackendTask.map
|
|
329
322
|
(\allRoutes ->
|
|
330
323
|
if allRoutes |> List.member routeParams then
|
|
331
324
|
Nothing
|
|
@@ -348,73 +341,87 @@ preRender { data, head, pages } =
|
|
|
348
341
|
|
|
349
342
|
{-| -}
|
|
350
343
|
preRenderWithFallback :
|
|
351
|
-
{ data : routeParams ->
|
|
352
|
-
, pages :
|
|
353
|
-
, head :
|
|
344
|
+
{ data : routeParams -> BackendTask FatalError (Server.Response.Response data ErrorPage)
|
|
345
|
+
, pages : BackendTask FatalError (List routeParams)
|
|
346
|
+
, head : App data action routeParams -> List Head.Tag
|
|
354
347
|
}
|
|
355
348
|
-> Builder routeParams data action
|
|
356
349
|
preRenderWithFallback { data, head, pages } =
|
|
357
350
|
WithData
|
|
358
|
-
{ data = data
|
|
359
|
-
, action = \_ ->
|
|
351
|
+
{ data = \_ -> data
|
|
352
|
+
, action = \_ _ -> BackendTask.fail (FatalError.fromString "Internal Error - actions should never be called for statically generated pages.")
|
|
360
353
|
, staticRoutes = pages
|
|
361
354
|
, head = head
|
|
362
355
|
, serverless = False
|
|
363
356
|
, handleRoute =
|
|
364
357
|
\moduleContext toRecord routeParams ->
|
|
365
|
-
|
|
358
|
+
BackendTask.succeed Nothing
|
|
366
359
|
, kind = "prerender-with-fallback"
|
|
367
360
|
}
|
|
368
361
|
|
|
369
362
|
|
|
370
363
|
{-| -}
|
|
371
364
|
serverRender :
|
|
372
|
-
{ data : routeParams -> Server.Request.Parser (
|
|
373
|
-
, action : routeParams -> Server.Request.Parser (
|
|
374
|
-
, head :
|
|
365
|
+
{ data : routeParams -> Server.Request.Parser (BackendTask FatalError (Server.Response.Response data ErrorPage))
|
|
366
|
+
, action : routeParams -> Server.Request.Parser (BackendTask FatalError (Server.Response.Response action ErrorPage))
|
|
367
|
+
, head : App data action routeParams -> List Head.Tag
|
|
375
368
|
}
|
|
376
369
|
-> Builder routeParams data action
|
|
377
370
|
serverRender { data, action, head } =
|
|
378
371
|
WithData
|
|
379
372
|
{ data =
|
|
380
|
-
\routeParams ->
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
373
|
+
\requestPayload routeParams ->
|
|
374
|
+
(routeParams
|
|
375
|
+
|> data
|
|
376
|
+
|> Server.Request.getDecoder
|
|
377
|
+
|> (\decoder ->
|
|
378
|
+
Json.Decode.decodeValue decoder requestPayload
|
|
379
|
+
|> Result.mapError Json.Decode.errorToString
|
|
380
|
+
|> BackendTask.fromResult
|
|
381
|
+
-- TODO include title and better error context and formatting
|
|
382
|
+
|> BackendTask.onError (\error -> BackendTask.fail (FatalError.fromString error))
|
|
383
|
+
)
|
|
384
|
+
)
|
|
385
|
+
|> BackendTask.andThen
|
|
388
386
|
(\rendered ->
|
|
389
387
|
case rendered of
|
|
390
388
|
Ok okRendered ->
|
|
391
389
|
okRendered
|
|
392
390
|
|
|
393
391
|
Err error ->
|
|
394
|
-
Server.Request.errorsToString error
|
|
392
|
+
Server.Request.errorsToString error
|
|
393
|
+
|> FatalError.fromString
|
|
394
|
+
|> BackendTask.fail
|
|
395
395
|
)
|
|
396
396
|
, action =
|
|
397
|
-
\routeParams ->
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
397
|
+
\requestPayload routeParams ->
|
|
398
|
+
(routeParams
|
|
399
|
+
|> action
|
|
400
|
+
|> Server.Request.getDecoder
|
|
401
|
+
|> (\decoder ->
|
|
402
|
+
Json.Decode.decodeValue decoder requestPayload
|
|
403
|
+
|> Result.mapError Json.Decode.errorToString
|
|
404
|
+
|> BackendTask.fromResult
|
|
405
|
+
-- TODO include title and better error context and formatting
|
|
406
|
+
|> BackendTask.onError (\error -> BackendTask.fail (FatalError.fromString error))
|
|
407
|
+
)
|
|
408
|
+
)
|
|
409
|
+
|> BackendTask.andThen
|
|
405
410
|
(\rendered ->
|
|
406
411
|
case rendered of
|
|
407
412
|
Ok okRendered ->
|
|
408
413
|
okRendered
|
|
409
414
|
|
|
410
415
|
Err error ->
|
|
411
|
-
Server.Request.errorsToString error
|
|
416
|
+
Server.Request.errorsToString error
|
|
417
|
+
|> FatalError.fromString
|
|
418
|
+
|> BackendTask.fail
|
|
412
419
|
)
|
|
413
|
-
, staticRoutes =
|
|
420
|
+
, staticRoutes = BackendTask.succeed []
|
|
414
421
|
, head = head
|
|
415
422
|
, serverless = True
|
|
416
423
|
, handleRoute =
|
|
417
424
|
\moduleContext toRecord routeParams ->
|
|
418
|
-
|
|
425
|
+
BackendTask.succeed Nothing
|
|
419
426
|
, kind = "serverless"
|
|
420
427
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
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)
|
|
8
|
-
import
|
|
9
|
+
import UrlPath exposing (UrlPath)
|
|
9
10
|
import Route exposing (Route)
|
|
10
11
|
import View exposing (View)
|
|
11
12
|
|
|
@@ -16,7 +17,7 @@ type alias SharedTemplate msg sharedModel sharedData mappedMsg =
|
|
|
16
17
|
->
|
|
17
18
|
Maybe
|
|
18
19
|
{ path :
|
|
19
|
-
{ path :
|
|
20
|
+
{ path : UrlPath
|
|
20
21
|
, query : Maybe String
|
|
21
22
|
, fragment : Maybe String
|
|
22
23
|
}
|
|
@@ -28,18 +29,18 @@ type alias SharedTemplate msg sharedModel sharedData mappedMsg =
|
|
|
28
29
|
, view :
|
|
29
30
|
sharedData
|
|
30
31
|
->
|
|
31
|
-
{ path :
|
|
32
|
+
{ path : UrlPath
|
|
32
33
|
, route : Maybe Route
|
|
33
34
|
}
|
|
34
35
|
-> sharedModel
|
|
35
36
|
-> (msg -> mappedMsg)
|
|
36
37
|
-> View mappedMsg
|
|
37
38
|
-> { body : List (Html mappedMsg), title : String }
|
|
38
|
-
, data :
|
|
39
|
-
, subscriptions :
|
|
39
|
+
, data : BackendTask.BackendTask FatalError sharedData
|
|
40
|
+
, subscriptions : UrlPath -> sharedModel -> Sub msg
|
|
40
41
|
, onPageChange :
|
|
41
42
|
Maybe
|
|
42
|
-
({ path :
|
|
43
|
+
({ path : UrlPath
|
|
43
44
|
, query : Maybe String
|
|
44
45
|
, fragment : Maybe String
|
|
45
46
|
}
|
|
@@ -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
|
+
}
|