elm-pages 3.0.0-beta.4 → 3.0.0-beta.40

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 (140) hide show
  1. package/README.md +10 -1
  2. package/adapter/netlify.js +207 -0
  3. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2678 -2725
  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 +1447 -342
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +17004 -13817
  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 +4 -4
  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 +1447 -342
  27. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25025 -21739
  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 +4 -4
  30. package/generator/review/elm.json +10 -10
  31. package/generator/src/RouteBuilder.elm +115 -109
  32. package/generator/src/SharedTemplate.elm +3 -2
  33. package/generator/src/SiteConfig.elm +3 -2
  34. package/generator/src/basepath-middleware.js +3 -3
  35. package/generator/src/build.js +209 -92
  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 +39 -0
  41. package/generator/src/copy-dir.js +2 -2
  42. package/generator/src/dev-server.js +176 -138
  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 +39 -28
  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 +77 -0
  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 +6 -5
  65. package/generator/template/app/Effect.elm +123 -0
  66. package/generator/template/app/ErrorPage.elm +37 -6
  67. package/generator/template/app/Route/Index.elm +17 -10
  68. package/generator/template/app/Shared.elm +24 -47
  69. package/generator/template/app/Site.elm +19 -6
  70. package/generator/template/app/View.elm +1 -8
  71. package/generator/template/elm-tooling.json +0 -3
  72. package/generator/template/elm.json +32 -24
  73. package/generator/template/package.json +10 -4
  74. package/package.json +30 -27
  75. package/src/ApiRoute.elm +199 -61
  76. package/src/BackendTask/Custom.elm +325 -0
  77. package/src/BackendTask/Env.elm +90 -0
  78. package/src/{DataSource → BackendTask}/File.elm +171 -56
  79. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  80. package/src/BackendTask/Http.elm +679 -0
  81. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  82. package/src/BackendTask/Internal/Request.elm +69 -0
  83. package/src/BackendTask/Random.elm +79 -0
  84. package/src/BackendTask/Time.elm +47 -0
  85. package/src/BackendTask.elm +537 -0
  86. package/src/FatalError.elm +90 -0
  87. package/src/Head.elm +237 -7
  88. package/src/HtmlPrinter.elm +7 -3
  89. package/src/Internal/ApiRoute.elm +7 -5
  90. package/src/PageServerResponse.elm +6 -1
  91. package/src/Pages/Form.elm +229 -0
  92. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  93. package/src/Pages/Internal/FatalError.elm +5 -0
  94. package/src/Pages/Internal/Msg.elm +93 -0
  95. package/src/Pages/Internal/Platform/Cli.elm +612 -763
  96. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  97. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  98. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  99. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  100. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  101. package/src/Pages/Internal/Platform.elm +327 -194
  102. package/src/Pages/Internal/Script.elm +17 -0
  103. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  104. package/src/Pages/Manifest.elm +29 -4
  105. package/src/Pages/PageUrl.elm +23 -9
  106. package/src/Pages/ProgramConfig.elm +26 -15
  107. package/src/Pages/Script.elm +109 -0
  108. package/src/Pages/SiteConfig.elm +3 -2
  109. package/src/Pages/StaticHttp/Request.elm +2 -2
  110. package/src/Pages/StaticHttpRequest.elm +23 -99
  111. package/src/Pages/Transition.elm +12 -3
  112. package/src/PagesMsg.elm +82 -0
  113. package/src/Path.elm +16 -19
  114. package/src/QueryParams.elm +21 -172
  115. package/src/RequestsAndPending.elm +37 -20
  116. package/src/Result/Extra.elm +26 -0
  117. package/src/Scaffold/Form.elm +546 -0
  118. package/src/Scaffold/Route.elm +1402 -0
  119. package/src/Server/Request.elm +73 -72
  120. package/src/Server/Session.elm +62 -42
  121. package/src/Server/SetCookie.elm +12 -4
  122. package/src/Stub.elm +53 -0
  123. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  124. package/src/DataSource/Env.elm +0 -38
  125. package/src/DataSource/Http.elm +0 -446
  126. package/src/DataSource/Internal/Request.elm +0 -20
  127. package/src/DataSource/Port.elm +0 -90
  128. package/src/DataSource.elm +0 -538
  129. package/src/Form/Field.elm +0 -717
  130. package/src/Form/FieldStatus.elm +0 -36
  131. package/src/Form/FieldView.elm +0 -417
  132. package/src/Form/FormData.elm +0 -22
  133. package/src/Form/Validation.elm +0 -391
  134. package/src/Form/Value.elm +0 -118
  135. package/src/Form.elm +0 -1683
  136. package/src/FormDecoder.elm +0 -102
  137. package/src/Pages/FormState.elm +0 -256
  138. package/src/Pages/Generate.elm +0 -800
  139. package/src/Pages/Internal/Form.elm +0 -17
  140. package/src/Pages/Msg.elm +0 -79
@@ -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: 1646606691, fuzzRuns: 100, filter: null };
78
+ const flags = { initialSeed: 1451258136, 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 = 2;
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: 1646606691,
85
+ initialSeed: 1451258136,
86
86
  fuzzRuns: 100,
87
- mode: "consoleNoColor",
87
+ mode: "consoleColor",
88
88
  verbosity: verbosity,
89
89
  globs: [],
90
- paths: ["/home/runner/work/elm-pages-v3-beta/elm-pages-v3-beta/generator/review/tests/Pages/Review/NoContractViolationsTest.elm"],
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-community/result-extra": "2.4.0",
14
- "jfmengels/elm-review": "2.4.2",
15
- "mdgriffith/elm-codegen": "2.0.0",
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/json": "1.1.3",
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.2",
26
+ "elm/virtual-dom": "1.0.3",
27
27
  "elm-community/basics-extra": "4.1.0",
28
- "elm-community/list-extra": "8.3.0",
28
+ "elm-community/list-extra": "8.7.0",
29
29
  "elm-community/maybe-extra": "5.3.0",
30
- "elm-explorations/test": "1.2.2",
31
- "miniBill/elm-unicode": "1.0.2",
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.2.2"
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
- , StaticPayload
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 `DataSource`'s, but it has no `init`, `update`, or `subscriptions`.
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 DataSource API. Since the data
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 `DataSource` for our page.
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 StaticPayload
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
- DataSource.succeed
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 Bytes exposing (Bytes)
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
96
97
  import Pages.Fetcher
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 -> DataSource (Server.Response.Response data ErrorPage)
113
- , action : routeParams -> DataSource (Server.Response.Response action ErrorPage)
114
- , staticRoutes : DataSource (List routeParams)
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
- Maybe PageUrl
117
- -> Shared.Model
116
+ Shared.Model
118
117
  -> model
119
- -> StaticPayload data action routeParams
120
- -> View (Pages.Msg.Msg msg)
118
+ -> App data action routeParams
119
+ -> View (PagesMsg msg)
121
120
  , head :
122
- StaticPayload data action routeParams
121
+ App data action routeParams
123
122
  -> 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)
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,36 +135,37 @@ type alias StatelessRoute routeParams data action =
136
135
 
137
136
 
138
137
  {-| -}
139
- type alias StaticPayload data action routeParams =
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 ) }
147
147
  -> Pages.Fetcher.Fetcher (Result Http.Error action)
148
148
  , transition : Maybe Pages.Transition.Transition
149
149
  , fetchers : Dict String (Pages.Transition.FetcherState (Maybe action))
150
- , pageFormState : Pages.FormState.PageFormState
150
+ , pageFormState : Form.Model
151
151
  }
152
152
 
153
153
 
154
154
  {-| -}
155
155
  type Builder routeParams data action
156
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)
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
- StaticPayload data action routeParams
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
- -> DataSource (Maybe NotFoundReason)
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
- Maybe PageUrl
176
+ App data action routeParams
177
177
  -> Shared.Model
178
- -> StaticPayload data action routeParams
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 = \maybePageUrl sharedModel _ -> view maybePageUrl sharedModel
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 = \_ _ _ -> ( {}, Effect.none )
192
- , update = \_ _ _ _ _ -> ( {}, Effect.none, Nothing )
193
- , subscriptions = \_ _ _ _ _ -> Sub.none
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
- Maybe PageUrl
210
+ App data action routeParams
212
211
  -> Shared.Model
213
212
  -> 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
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 staticPayload ->
227
- config.view model sharedModel staticPayload
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
- \pageUrl staticPayload msg model sharedModel ->
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
- \maybePageUrl routeParams path model sharedModel ->
247
- config.subscriptions maybePageUrl routeParams path sharedModel model
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
- Maybe PageUrl
250
+ App data action routeParams
258
251
  -> Shared.Model
259
252
  -> 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
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
- \pageUrl staticPayload msg model sharedModel ->
279
- config.update pageUrl
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
- \maybePageUrl routeParams path model sharedModel ->
286
- config.subscriptions maybePageUrl routeParams path sharedModel model
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 : DataSource data
296
- , head : StaticPayload data action {} -> List Head.Tag
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 |> DataSource.map Server.Response.render
302
- , action = \_ -> DataSource.fail "Internal Error - actions should never be called for statically generated pages."
303
- , staticRoutes = DataSource.succeed [ {} ]
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 = \_ _ _ -> DataSource.succeed Nothing
298
+ , handleRoute = \_ _ _ -> BackendTask.succeed Nothing
307
299
  , kind = "static"
308
300
  }
309
301
 
310
302
 
311
303
  {-| -}
312
304
  preRender :
313
- { data : routeParams -> DataSource data
314
- , pages : DataSource (List routeParams)
315
- , head : StaticPayload data action routeParams -> List Head.Tag
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 >> DataSource.map Server.Response.render
321
- , action = \_ -> DataSource.fail "Internal Error - actions should never be called for statically generated pages."
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
- |> DataSource.map
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 -> DataSource (Server.Response.Response data ErrorPage)
352
- , pages : DataSource (List routeParams)
353
- , head : StaticPayload data action routeParams -> List Head.Tag
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 = \_ -> DataSource.fail "Internal Error - actions should never be called for statically generated pages."
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
- DataSource.succeed Nothing
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 (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
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
- DataSource.Http.get
382
- "$$elm-pages$$headers"
383
- (routeParams
384
- |> data
385
- |> Server.Request.getDecoder
386
- )
387
- |> DataSource.andThen
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 |> DataSource.fail
391
+ Server.Request.errorsToString error
392
+ |> FatalError.fromString
393
+ |> BackendTask.fail
395
394
  )
396
395
  , action =
397
- \routeParams ->
398
- DataSource.Http.get
399
- "$$elm-pages$$headers"
400
- (routeParams
401
- |> action
402
- |> Server.Request.getDecoder
403
- )
404
- |> DataSource.andThen
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 |> DataSource.fail
415
+ Server.Request.errorsToString error
416
+ |> FatalError.fromString
417
+ |> BackendTask.fail
412
418
  )
413
- , staticRoutes = DataSource.succeed []
419
+ , staticRoutes = BackendTask.succeed []
414
420
  , head = head
415
421
  , serverless = True
416
422
  , handleRoute =
417
423
  \moduleContext toRecord routeParams ->
418
- DataSource.succeed Nothing
424
+ BackendTask.succeed Nothing
419
425
  , kind = "serverless"
420
426
  }
@@ -1,7 +1,8 @@
1
1
  module SharedTemplate exposing (SharedTemplate)
2
2
 
3
- import DataSource
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 : DataSource.DataSource sharedData
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 DataSource exposing (DataSource)
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 : DataSource (List Head.Tag)
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
- module.exports = function baseMiddleware(base) {
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
- `did you mean to visit ${suggestionUrl} instead?`
37
+ `did you mean to visit ${suggestionUrl} instead?`
38
38
  );
39
39
  return;
40
40
  }
41
41
 
42
42
  next();
43
43
  };
44
- };
44
+ }