elm-pages 3.0.0-beta.9 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +2 -2
  2. package/adapter/netlify.js +207 -0
  3. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2731 -2939
  4. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  5. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  6. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  7. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  8. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  9. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  10. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16840 -13653
  13. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  14. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +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 +1527 -422
  27. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25118 -21832
  28. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  29. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
  30. package/generator/review/elm.json +10 -10
  31. package/generator/src/RouteBuilder.elm +93 -128
  32. package/generator/src/SharedTemplate.elm +8 -7
  33. package/generator/src/SiteConfig.elm +3 -2
  34. package/generator/src/basepath-middleware.js +3 -3
  35. package/generator/src/build.js +143 -59
  36. package/generator/src/cli.js +292 -88
  37. package/generator/src/codegen.js +29 -27
  38. package/generator/src/compatibility-key.js +3 -0
  39. package/generator/src/compile-elm.js +43 -26
  40. package/generator/src/config.js +2 -4
  41. package/generator/src/copy-dir.js +2 -2
  42. package/generator/src/dev-server.js +160 -102
  43. package/generator/src/dir-helpers.js +9 -26
  44. package/generator/src/elm-codegen.js +5 -4
  45. package/generator/src/elm-file-constants.js +2 -3
  46. package/generator/src/error-formatter.js +12 -11
  47. package/generator/src/file-helpers.js +3 -4
  48. package/generator/src/generate-template-module-connector.js +23 -23
  49. package/generator/src/init.js +9 -8
  50. package/generator/src/pre-render-html.js +10 -13
  51. package/generator/src/render-test.js +109 -0
  52. package/generator/src/render-worker.js +25 -28
  53. package/generator/src/render.js +320 -143
  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 +1 -3
  61. package/generator/src/vite-utils.js +1 -2
  62. package/generator/static-code/elm-pages.js +10 -0
  63. package/generator/static-code/hmr.js +79 -13
  64. package/generator/template/app/Api.elm +3 -2
  65. package/generator/template/app/Effect.elm +155 -0
  66. package/generator/template/app/ErrorPage.elm +49 -6
  67. package/generator/template/app/Route/Blog/Slug_.elm +86 -0
  68. package/generator/template/app/Route/Greet.elm +107 -0
  69. package/generator/template/app/Route/Hello.elm +119 -0
  70. package/generator/template/app/Route/Index.elm +26 -25
  71. package/generator/template/app/Shared.elm +38 -39
  72. package/generator/template/app/Site.elm +4 -7
  73. package/generator/template/app/View.elm +9 -8
  74. package/generator/template/codegen/elm.codegen.json +18 -0
  75. package/generator/template/custom-backend-task.ts +3 -0
  76. package/generator/template/elm-pages.config.mjs +13 -0
  77. package/generator/template/elm-tooling.json +0 -3
  78. package/generator/template/elm.json +25 -20
  79. package/generator/template/index.ts +1 -2
  80. package/generator/template/netlify.toml +4 -1
  81. package/generator/template/package.json +10 -4
  82. package/generator/template/script/.elm-pages/compiled-ports/custom-backend-task.mjs +7 -0
  83. package/generator/template/script/custom-backend-task.ts +3 -0
  84. package/generator/template/script/elm.json +61 -0
  85. package/generator/template/script/src/AddRoute.elm +312 -0
  86. package/generator/template/script/src/Stars.elm +42 -0
  87. package/package.json +30 -27
  88. package/src/ApiRoute.elm +249 -82
  89. package/src/BackendTask/Custom.elm +325 -0
  90. package/src/BackendTask/Env.elm +90 -0
  91. package/src/{DataSource → BackendTask}/File.elm +171 -56
  92. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  93. package/src/BackendTask/Http.elm +679 -0
  94. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  95. package/src/BackendTask/Internal/Request.elm +69 -0
  96. package/src/BackendTask/Random.elm +79 -0
  97. package/src/BackendTask/Time.elm +47 -0
  98. package/src/BackendTask.elm +531 -0
  99. package/src/FatalError.elm +90 -0
  100. package/src/FormData.elm +21 -18
  101. package/src/Head/Seo.elm +4 -4
  102. package/src/Head.elm +112 -8
  103. package/src/Internal/ApiRoute.elm +7 -5
  104. package/src/Internal/Request.elm +84 -4
  105. package/src/PageServerResponse.elm +6 -1
  106. package/src/Pages/ConcurrentSubmission.elm +127 -0
  107. package/src/Pages/Form.elm +340 -0
  108. package/src/Pages/FormData.elm +19 -0
  109. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  110. package/src/Pages/Internal/FatalError.elm +5 -0
  111. package/src/Pages/Internal/Msg.elm +93 -0
  112. package/src/Pages/Internal/NotFoundReason.elm +4 -4
  113. package/src/Pages/Internal/Platform/Cli.elm +586 -768
  114. package/src/Pages/Internal/Platform/CompatibilityKey.elm +1 -1
  115. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  116. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  117. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  118. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  119. package/src/Pages/Internal/Platform.elm +330 -203
  120. package/src/Pages/Internal/ResponseSketch.elm +2 -2
  121. package/src/Pages/Internal/Script.elm +17 -0
  122. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  123. package/src/Pages/Manifest.elm +52 -11
  124. package/src/Pages/Navigation.elm +85 -0
  125. package/src/Pages/PageUrl.elm +26 -12
  126. package/src/Pages/ProgramConfig.elm +32 -22
  127. package/src/Pages/Script.elm +166 -0
  128. package/src/Pages/SiteConfig.elm +3 -2
  129. package/src/Pages/StaticHttp/Request.elm +2 -2
  130. package/src/Pages/StaticHttpRequest.elm +23 -99
  131. package/src/Pages/Url.elm +3 -3
  132. package/src/PagesMsg.elm +88 -0
  133. package/src/QueryParams.elm +21 -172
  134. package/src/RenderRequest.elm +7 -7
  135. package/src/RequestsAndPending.elm +37 -20
  136. package/src/Result/Extra.elm +26 -0
  137. package/src/Scaffold/Form.elm +569 -0
  138. package/src/Scaffold/Route.elm +1431 -0
  139. package/src/Server/Request.elm +476 -1001
  140. package/src/Server/Response.elm +130 -36
  141. package/src/Server/Session.elm +181 -111
  142. package/src/Server/SetCookie.elm +80 -32
  143. package/src/Stub.elm +53 -0
  144. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  145. package/src/{Path.elm → UrlPath.elm} +33 -36
  146. package/generator/template/public/images/icon-png.png +0 -0
  147. package/src/DataSource/Env.elm +0 -38
  148. package/src/DataSource/Http.elm +0 -446
  149. package/src/DataSource/Internal/Request.elm +0 -20
  150. package/src/DataSource/Port.elm +0 -90
  151. package/src/DataSource.elm +0 -546
  152. package/src/Form/Field.elm +0 -717
  153. package/src/Form/FieldStatus.elm +0 -36
  154. package/src/Form/FieldView.elm +0 -417
  155. package/src/Form/FormData.elm +0 -22
  156. package/src/Form/Validation.elm +0 -391
  157. package/src/Form/Value.elm +0 -118
  158. package/src/Form.elm +0 -1683
  159. package/src/FormDecoder.elm +0 -102
  160. package/src/Pages/FormState.elm +0 -256
  161. package/src/Pages/Generate.elm +0 -1242
  162. package/src/Pages/Internal/Form.elm +0 -17
  163. package/src/Pages/Internal/Platform/Cli.elm.bak +0 -1276
  164. package/src/Pages/Msg.elm +0 -79
  165. package/src/Pages/Transition.elm +0 -70
@@ -0,0 +1,1431 @@
1
+ module Scaffold.Route exposing
2
+ ( buildWithLocalState, buildWithSharedState, buildNoState, Builder
3
+ , Type(..)
4
+ , serverRender
5
+ , preRender, single
6
+ , addDeclarations
7
+ , moduleNameCliArg
8
+ )
9
+
10
+ {-| This module provides some functions for scaffolding code for a new Route Module. It uses [`elm-codegen`'s API](https://package.elm-lang.org/packages/mdgriffith/elm-codegen/latest/) for generating code.
11
+
12
+ Typically you'll want to use this via the `elm-pages run` CLI command. The default starter template includes a Script that uses these functions, which you can tweak to customize your scaffolding commands.
13
+ [Learn more about writing and running elm-pages Scripts for scaffolding](https://elm-pages.com/docs/elm-pages-scripts#scaffolding-a-route-module).
14
+
15
+ It's typically easiest to modify the `AddRoute` script from the starter template and adjust it to your needs rather than writing one from scratch.
16
+
17
+
18
+ ## Initializing the Generator Builder
19
+
20
+ These functions mirror the `RouteBuilder` API that you use in your Route modules to define your route. The difference is that
21
+ instead of defining a route, this is defining a code generator for a Route module.
22
+
23
+ @docs buildWithLocalState, buildWithSharedState, buildNoState, Builder
24
+
25
+ @docs Type
26
+
27
+
28
+ ## Generating Server-Rendered Pages
29
+
30
+ @docs serverRender
31
+
32
+
33
+ ## Generating pre-rendered pages
34
+
35
+ @docs preRender, single
36
+
37
+
38
+ ## Including Additional elm-codegen Declarations
39
+
40
+ @docs addDeclarations
41
+
42
+
43
+ ## CLI Options Parsing Helpers
44
+
45
+ @docs moduleNameCliArg
46
+
47
+ -}
48
+
49
+ import Cli.Option as Option
50
+ import Cli.Validate
51
+ import Elm
52
+ import Elm.Annotation
53
+ import Elm.Declare
54
+ import Elm.Op
55
+ import Pages.Internal.RoutePattern as RoutePattern
56
+
57
+
58
+ {-| A positional argument for elm-cli-options-parser that does a Regex validation to check that the module name is a valid Elm Route module name.
59
+ -}
60
+ moduleNameCliArg : Option.Option from String builderState -> Option.Option from (List String) builderState
61
+ moduleNameCliArg =
62
+ Option.validate
63
+ (Cli.Validate.regex moduleNameRegex)
64
+ >> Option.map
65
+ (\rawModuleName ->
66
+ rawModuleName |> String.split "."
67
+ )
68
+
69
+
70
+ moduleNameRegex : String
71
+ moduleNameRegex =
72
+ "^[A-Z][a-zA-Z0-9_]*(\\.([A-Z][a-zA-Z0-9_]*))*$"
73
+
74
+
75
+ {-| -}
76
+ type Type
77
+ = Alias Elm.Annotation.Annotation
78
+ | Custom (List Elm.Variant)
79
+
80
+
81
+ typeToDeclaration : String -> Type -> Elm.Declaration
82
+ typeToDeclaration name type_ =
83
+ case type_ of
84
+ Alias annotation ->
85
+ Elm.alias name annotation
86
+
87
+ Custom variants ->
88
+ Elm.customType name variants
89
+
90
+
91
+ {-| -}
92
+ type Builder
93
+ = ServerRender
94
+ (List Elm.Declaration)
95
+ { data : ( Type, Elm.Expression -> Elm.Expression -> Elm.Expression )
96
+ , action : ( Type, Elm.Expression -> Elm.Expression -> Elm.Expression )
97
+ , head : Elm.Expression -> Elm.Expression
98
+ , moduleName : List String
99
+ }
100
+ | PreRender
101
+ (List Elm.Declaration)
102
+ { data : ( Type, Elm.Expression -> Elm.Expression )
103
+ , pages : Maybe Elm.Expression
104
+ , head : Elm.Expression -> Elm.Expression
105
+ , moduleName : List String
106
+ }
107
+
108
+
109
+ {-| -}
110
+ serverRender :
111
+ { data : ( Type, Elm.Expression -> Elm.Expression -> Elm.Expression )
112
+ , action : ( Type, Elm.Expression -> Elm.Expression -> Elm.Expression )
113
+ , head : Elm.Expression -> Elm.Expression
114
+ , moduleName : List String
115
+ }
116
+ -> Builder
117
+ serverRender =
118
+ ServerRender []
119
+
120
+
121
+ {-| -}
122
+ preRender :
123
+ { data : ( Type, Elm.Expression -> Elm.Expression )
124
+ , pages : Elm.Expression
125
+ , head : Elm.Expression -> Elm.Expression
126
+ , moduleName : List String
127
+ }
128
+ -> Builder
129
+ preRender input =
130
+ --let
131
+ -- hasDynamicRouteSegments : Bool
132
+ -- hasDynamicRouteSegments =
133
+ -- RoutePattern.fromModuleName input.moduleName
134
+ -- -- TODO give error if not parseable here
135
+ -- |> Maybe.map RoutePattern.hasRouteParams
136
+ -- |> Maybe.withDefault False
137
+ --in
138
+ PreRender []
139
+ { data = input.data
140
+ , pages =
141
+ input.pages
142
+ |> Elm.withType
143
+ (throwableTask
144
+ (Elm.Annotation.list <| Elm.Annotation.named [] "RouteParams")
145
+ )
146
+ |> Just
147
+ , head = input.head
148
+ , moduleName = input.moduleName
149
+ }
150
+
151
+
152
+ {-| -}
153
+ single :
154
+ { data : ( Type, Elm.Expression )
155
+ , head : Elm.Expression -> Elm.Expression
156
+ , moduleName : List String
157
+ }
158
+ -> Builder
159
+ single input =
160
+ PreRender []
161
+ { data = ( Tuple.first input.data, \_ -> Tuple.second input.data )
162
+ , pages = Nothing
163
+ , head = input.head
164
+ , moduleName = input.moduleName
165
+ }
166
+
167
+
168
+ {-| -}
169
+ buildNoState :
170
+ { view : { shared : Elm.Expression, app : Elm.Expression } -> Elm.Expression
171
+ }
172
+ -> Builder
173
+ -> { path : String, body : String }
174
+ buildNoState definitions builder_ =
175
+ case builder_ of
176
+ ServerRender declarations builder ->
177
+ userFunction builder.moduleName
178
+ { view =
179
+ \app shared _ ->
180
+ definitions.view
181
+ { shared = shared
182
+ , app = app
183
+ }
184
+ , localState = Nothing
185
+ , data = builder.data |> Tuple.second
186
+ , action = builder.action |> Tuple.second |> Action
187
+ , head = builder.head
188
+ , types =
189
+ { model = Alias (Elm.Annotation.record [])
190
+ , msg = Alias Elm.Annotation.unit
191
+ , data = builder.data |> Tuple.first
192
+ , actionData = builder.action |> Tuple.first
193
+ }
194
+ , declarations = declarations
195
+ }
196
+
197
+ PreRender declarations builder ->
198
+ userFunction builder.moduleName
199
+ { view =
200
+ \app shared _ ->
201
+ definitions.view
202
+ { shared = shared
203
+ , app = app
204
+ }
205
+ , localState = Nothing
206
+ , data = builder.data |> Tuple.second |> (\fn -> \_ -> fn)
207
+ , action = builder.pages |> Pages
208
+ , head = builder.head
209
+ , types =
210
+ { model = Alias (Elm.Annotation.record [])
211
+ , msg = Alias Elm.Annotation.unit
212
+ , data = builder.data |> Tuple.first
213
+ , actionData =
214
+ throwableTask
215
+ (Elm.Annotation.list (Elm.Annotation.named [] "RouteParams"))
216
+ |> Alias
217
+ }
218
+ , declarations = declarations
219
+ }
220
+
221
+
222
+ {-| The helpers in this module help you generate a Route module file with the core boilerplate abstracted away.
223
+
224
+ You can also define additional top-level declarations in the generated Route module using this helper.
225
+
226
+ -}
227
+ addDeclarations : List Elm.Declaration -> Builder -> Builder
228
+ addDeclarations declarations builder =
229
+ case builder of
230
+ ServerRender existingDeclarations record ->
231
+ ServerRender (existingDeclarations ++ declarations) record
232
+
233
+ PreRender existingDeclarations record ->
234
+ PreRender (existingDeclarations ++ declarations) record
235
+
236
+
237
+ {-| -}
238
+ buildWithLocalState :
239
+ { view :
240
+ { shared : Elm.Expression, model : Elm.Expression, app : Elm.Expression } -> Elm.Expression
241
+ , update :
242
+ { shared : Elm.Expression
243
+ , app : Elm.Expression
244
+ , msg : Elm.Expression
245
+ , model : Elm.Expression
246
+ }
247
+ -> Elm.Expression
248
+ , init :
249
+ { shared : Elm.Expression
250
+ , app : Elm.Expression
251
+ }
252
+ -> Elm.Expression
253
+ , subscriptions :
254
+ { routeParams : Elm.Expression
255
+ , path : Elm.Expression
256
+ , shared : Elm.Expression
257
+ , model : Elm.Expression
258
+ }
259
+ -> Elm.Expression
260
+ , msg : Type
261
+ , model : Type
262
+ }
263
+ -> Builder
264
+ -> { path : String, body : String }
265
+ buildWithLocalState definitions builder_ =
266
+ case builder_ of
267
+ ServerRender declarations builder ->
268
+ userFunction builder.moduleName
269
+ { view =
270
+ \app shared model ->
271
+ definitions.view
272
+ { shared = shared
273
+ , model = model
274
+ , app = app
275
+ }
276
+ , localState =
277
+ Just
278
+ { update =
279
+ \app shared msg model ->
280
+ definitions.update
281
+ { shared = shared
282
+ , app = app
283
+ , msg = msg
284
+ , model = model
285
+ }
286
+ , init =
287
+ \app shared ->
288
+ definitions.init
289
+ { shared = shared
290
+ , app = app
291
+ }
292
+ , subscriptions =
293
+ \routeParams path shared model ->
294
+ definitions.subscriptions
295
+ { routeParams = routeParams
296
+ , path = path
297
+ , shared = shared
298
+ , model = model
299
+ }
300
+ , state = LocalState
301
+ }
302
+ , data = builder.data |> Tuple.second
303
+ , action = builder.action |> Tuple.second |> Action
304
+ , head = builder.head
305
+ , types =
306
+ { model = definitions.model
307
+ , msg = definitions.msg
308
+ , data = builder.data |> Tuple.first
309
+ , actionData = builder.action |> Tuple.first
310
+ }
311
+ , declarations = declarations
312
+ }
313
+
314
+ PreRender declarations builder ->
315
+ userFunction builder.moduleName
316
+ { view =
317
+ \app shared model ->
318
+ definitions.view
319
+ { shared = shared
320
+ , model = model
321
+ , app = app
322
+ }
323
+ , localState =
324
+ Just
325
+ { update =
326
+ \app shared msg model ->
327
+ definitions.update
328
+ { shared = shared
329
+ , app = app
330
+ , msg = msg
331
+ , model = model
332
+ }
333
+ , init =
334
+ \app shared ->
335
+ definitions.init
336
+ { shared = shared
337
+ , app = app
338
+ }
339
+ , subscriptions =
340
+ \routeParams path shared model ->
341
+ definitions.subscriptions
342
+ { routeParams = routeParams
343
+ , path = path
344
+ , shared = shared
345
+ , model = model
346
+ }
347
+ , state = LocalState
348
+ }
349
+ , data = builder.data |> Tuple.second |> (\fn -> \_ -> fn)
350
+ , action = builder.pages |> Pages
351
+ , head = builder.head
352
+ , types =
353
+ { model = definitions.model
354
+ , msg = definitions.msg
355
+ , data = builder.data |> Tuple.first
356
+ , actionData =
357
+ throwableTask
358
+ (Elm.Annotation.list (Elm.Annotation.named [] "RouteParams"))
359
+ |> Alias
360
+ }
361
+ , declarations = declarations
362
+ }
363
+
364
+
365
+ {-| -}
366
+ buildWithSharedState :
367
+ { view :
368
+ { shared : Elm.Expression, model : Elm.Expression, app : Elm.Expression } -> Elm.Expression
369
+ , update :
370
+ { shared : Elm.Expression
371
+ , app : Elm.Expression
372
+ , msg : Elm.Expression
373
+ , model : Elm.Expression
374
+ }
375
+ -> Elm.Expression
376
+ , init :
377
+ { shared : Elm.Expression
378
+ , app : Elm.Expression
379
+ }
380
+ -> Elm.Expression
381
+ , subscriptions :
382
+ { routeParams : Elm.Expression
383
+ , path : Elm.Expression
384
+ , shared : Elm.Expression
385
+ , model : Elm.Expression
386
+ }
387
+ -> Elm.Expression
388
+ , msg : Type
389
+ , model : Type
390
+ }
391
+ -> Builder
392
+ -> { path : String, body : String }
393
+ buildWithSharedState definitions builder_ =
394
+ case builder_ of
395
+ ServerRender declarations builder ->
396
+ userFunction builder.moduleName
397
+ { view =
398
+ \app shared model ->
399
+ definitions.view
400
+ { shared = shared
401
+ , model = model
402
+ , app = app
403
+ }
404
+ , localState =
405
+ Just
406
+ { update =
407
+ \app shared msg model ->
408
+ definitions.update
409
+ { shared = shared
410
+ , app = app
411
+ , msg = msg
412
+ , model = model
413
+ }
414
+ , init =
415
+ \app shared ->
416
+ definitions.init
417
+ { shared = shared
418
+ , app = app
419
+ }
420
+ , subscriptions =
421
+ \routeParams path shared model ->
422
+ definitions.subscriptions
423
+ { routeParams = routeParams
424
+ , path = path
425
+ , shared = shared
426
+ , model = model
427
+ }
428
+ , state = SharedState
429
+ }
430
+ , data = builder.data |> Tuple.second
431
+ , action = builder.action |> Tuple.second |> Action
432
+ , head = builder.head
433
+ , types =
434
+ { model = definitions.model
435
+ , msg = definitions.msg
436
+ , data = builder.data |> Tuple.first
437
+ , actionData = builder.action |> Tuple.first
438
+ }
439
+ , declarations = declarations
440
+ }
441
+
442
+ PreRender declarations builder ->
443
+ userFunction builder.moduleName
444
+ { view =
445
+ \app shared model ->
446
+ definitions.view
447
+ { shared = shared
448
+ , model = model
449
+ , app = app
450
+ }
451
+ , localState =
452
+ Just
453
+ { update =
454
+ \app shared msg model ->
455
+ definitions.update
456
+ { shared = shared
457
+ , app = app
458
+ , msg = msg
459
+ , model = model
460
+ }
461
+ , init =
462
+ \app shared ->
463
+ definitions.init
464
+ { shared = shared
465
+ , app = app
466
+ }
467
+ , subscriptions =
468
+ \routeParams path shared model ->
469
+ definitions.subscriptions
470
+ { routeParams = routeParams
471
+ , path = path
472
+ , shared = shared
473
+ , model = model
474
+ }
475
+ , state = SharedState
476
+ }
477
+ , data = builder.data |> Tuple.second |> (\fn -> \_ -> fn)
478
+ , action = builder.pages |> Pages
479
+ , head = builder.head
480
+ , types =
481
+ { model = definitions.model
482
+ , msg = definitions.msg
483
+ , data = builder.data |> Tuple.first
484
+ , actionData =
485
+ throwableTask
486
+ (Elm.Annotation.list (Elm.Annotation.named [] "RouteParams"))
487
+ |> Alias
488
+ }
489
+ , declarations = declarations
490
+ }
491
+
492
+
493
+ type State
494
+ = SharedState
495
+ | LocalState
496
+
497
+
498
+ type ActionOrPages
499
+ = Action (Elm.Expression -> Elm.Expression -> Elm.Expression)
500
+ | Pages (Maybe Elm.Expression)
501
+
502
+
503
+ {-| -}
504
+ userFunction :
505
+ List String
506
+ ->
507
+ { view : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
508
+ , localState :
509
+ Maybe
510
+ { update : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
511
+ , init : Elm.Expression -> Elm.Expression -> Elm.Expression
512
+ , subscriptions : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
513
+ , state : State
514
+ }
515
+ , data : Elm.Expression -> Elm.Expression -> Elm.Expression
516
+ , action : ActionOrPages
517
+ , head : Elm.Expression -> Elm.Expression
518
+ , types : { model : Type, msg : Type, data : Type, actionData : Type }
519
+ , declarations : List Elm.Declaration
520
+ }
521
+ -> { path : String, body : String }
522
+ userFunction moduleName definitions =
523
+ let
524
+ viewFn :
525
+ { declaration : Elm.Declaration
526
+ , call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
527
+ , callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
528
+ , value : List String -> Elm.Expression
529
+ }
530
+ viewFn =
531
+ case definitions.localState of
532
+ Just _ ->
533
+ Elm.Declare.fn3 "view"
534
+ ( "app", Just appType )
535
+ ( "shared"
536
+ , Just (Elm.Annotation.named [ "Shared" ] "Model")
537
+ )
538
+ ( "model", Just (Elm.Annotation.named [] "Model") )
539
+ (\app shared model ->
540
+ definitions.view app shared model
541
+ |> Elm.withType
542
+ (Elm.Annotation.namedWith [ "View" ]
543
+ "View"
544
+ [ Elm.Annotation.namedWith [ "PagesMsg" ]
545
+ "PagesMsg"
546
+ [ localType "Msg"
547
+ ]
548
+ ]
549
+ )
550
+ )
551
+
552
+ Nothing ->
553
+ let
554
+ viewDeclaration :
555
+ { declaration : Elm.Declaration
556
+ , call : Elm.Expression -> Elm.Expression -> Elm.Expression
557
+ , callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression
558
+ , value : List String -> Elm.Expression
559
+ }
560
+ viewDeclaration =
561
+ Elm.Declare.fn2 "view"
562
+ ( "app", Just appType )
563
+ ( "shared"
564
+ , Just (Elm.Annotation.named [ "Shared" ] "Model")
565
+ )
566
+ (\app shared ->
567
+ definitions.view app shared Elm.unit
568
+ |> Elm.withType
569
+ (Elm.Annotation.namedWith [ "View" ]
570
+ "View"
571
+ [ Elm.Annotation.namedWith [ "PagesMsg" ]
572
+ "PagesMsg"
573
+ [ localType "Msg"
574
+ ]
575
+ ]
576
+ )
577
+ )
578
+ in
579
+ { declaration = viewDeclaration.declaration
580
+ , call = \app shared _ -> viewDeclaration.call app shared
581
+ , callFrom = \a _ c d -> viewDeclaration.callFrom a c d
582
+ , value = viewDeclaration.value
583
+ }
584
+
585
+ localDefinitions :
586
+ Maybe
587
+ { updateFn :
588
+ { declaration : Elm.Declaration
589
+ , call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
590
+ , callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
591
+ , value : List String -> Elm.Expression
592
+ }
593
+ , initFn :
594
+ { declaration : Elm.Declaration
595
+ , call : Elm.Expression -> Elm.Expression -> Elm.Expression
596
+ , callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression
597
+ , value : List String -> Elm.Expression
598
+ }
599
+ , subscriptionsFn :
600
+ { declaration : Elm.Declaration
601
+ , call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
602
+ , callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
603
+ , value : List String -> Elm.Expression
604
+ }
605
+ , state : State
606
+ }
607
+ localDefinitions =
608
+ definitions.localState
609
+ |> Maybe.map
610
+ (\localState ->
611
+ { updateFn =
612
+ Elm.Declare.fn4 "update"
613
+ ( "app", Just appType )
614
+ ( "shared", Just (Elm.Annotation.named [ "Shared" ] "Model") )
615
+ ( "msg", Just (Elm.Annotation.named [] "Msg") )
616
+ ( "model", Just (Elm.Annotation.named [] "Model") )
617
+ (\app shared msg model ->
618
+ localState.update app shared msg model
619
+ |> Elm.withType
620
+ (Elm.Annotation.tuple
621
+ (localType "Model")
622
+ effectType
623
+ )
624
+ )
625
+ , initFn =
626
+ Elm.Declare.fn2 "init"
627
+ ( "app", Just appType )
628
+ ( "shared", Just (Elm.Annotation.named [ "Shared" ] "Model") )
629
+ (\shared app ->
630
+ localState.init app shared
631
+ |> Elm.withType
632
+ (Elm.Annotation.tuple
633
+ (localType "Model")
634
+ effectType
635
+ )
636
+ )
637
+ , subscriptionsFn =
638
+ Elm.Declare.fn4
639
+ "subscriptions"
640
+ ( "routeParams", "RouteParams" |> Elm.Annotation.named [] |> Just )
641
+ ( "path", Elm.Annotation.namedWith [ "UrlPath" ] "UrlPath" [] |> Just )
642
+ ( "shared", Just (Elm.Annotation.named [ "Shared" ] "Model") )
643
+ ( "model", localType "Model" |> Just )
644
+ (\routeParams path shared model ->
645
+ localState.subscriptions routeParams path shared model
646
+ |> Elm.withType (Elm.Annotation.namedWith [] "Sub" [ localType "Msg" ])
647
+ )
648
+ , state = localState.state
649
+ }
650
+ )
651
+
652
+ dataFn : { declaration : Elm.Declaration, call : List Elm.Expression -> Elm.Expression, callFrom : List String -> List Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }
653
+ dataFn =
654
+ case definitions.action of
655
+ Pages Nothing ->
656
+ Elm.Declare.function "data"
657
+ []
658
+ (\_ ->
659
+ definitions.data Elm.unit Elm.unit
660
+ |> Elm.withType
661
+ (case definitions.action of
662
+ Pages _ ->
663
+ throwableTask (Elm.Annotation.named [] "Data")
664
+
665
+ Action _ ->
666
+ myType "Data"
667
+ )
668
+ )
669
+
670
+ _ ->
671
+ Elm.Declare.function "data"
672
+ [ ( "routeParams"
673
+ , "RouteParams"
674
+ |> Elm.Annotation.named []
675
+ |> Just
676
+ )
677
+ , ( "request"
678
+ , "Request"
679
+ |> Elm.Annotation.named [ "Server", "Request" ]
680
+ |> Just
681
+ )
682
+ ]
683
+ (\args ->
684
+ case args of
685
+ [ arg, arg2 ] ->
686
+ definitions.data arg arg2
687
+ |> Elm.withType
688
+ (case definitions.action of
689
+ Pages _ ->
690
+ throwableTask (Elm.Annotation.named [] "Data")
691
+
692
+ Action _ ->
693
+ myType "Data"
694
+ )
695
+
696
+ _ ->
697
+ Elm.unit
698
+ )
699
+
700
+ actionFn : Maybe { declaration : Elm.Declaration, call : List Elm.Expression -> Elm.Expression, callFrom : List String -> List Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }
701
+ actionFn =
702
+ case definitions.action of
703
+ Action action_ ->
704
+ Elm.Declare.function "action"
705
+ [ ( "routeParams"
706
+ , "RouteParams"
707
+ |> Elm.Annotation.named []
708
+ |> Just
709
+ )
710
+ , ( "request"
711
+ , "Request"
712
+ |> Elm.Annotation.named [ "Server", "Request" ]
713
+ |> Just
714
+ )
715
+ ]
716
+ (\args ->
717
+ case args of
718
+ [ arg1, arg2 ] ->
719
+ action_ arg1 arg2 |> Elm.withType (myType "ActionData")
720
+
721
+ _ ->
722
+ Elm.unit
723
+ )
724
+ |> Just
725
+
726
+ Pages pages_ ->
727
+ pages_
728
+ |> Maybe.map
729
+ (\justPagesExpression ->
730
+ Elm.Declare.function "pages"
731
+ []
732
+ (\_ -> justPagesExpression)
733
+ )
734
+
735
+ headFn : { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }
736
+ headFn =
737
+ Elm.Declare.fn "head"
738
+ ( "app", Just appType )
739
+ (definitions.head
740
+ >> Elm.withType
741
+ (Elm.Annotation.list
742
+ (Elm.Annotation.named [ "Head" ] "Tag")
743
+ )
744
+ )
745
+ in
746
+ Elm.file ("Route" :: moduleName)
747
+ ([ definitions.types.model |> typeToDeclaration "Model" |> Elm.expose
748
+ , definitions.types.msg |> typeToDeclaration "Msg" |> Elm.expose
749
+ , Elm.alias "RouteParams"
750
+ (Elm.Annotation.record
751
+ (RoutePattern.fromModuleName moduleName
752
+ -- TODO give error if not parseable here
753
+ |> Maybe.map RoutePattern.toRouteParamsRecord
754
+ |> Maybe.withDefault []
755
+ )
756
+ )
757
+ |> Elm.expose
758
+ , Elm.declaration "route"
759
+ ((case definitions.action of
760
+ Action _ ->
761
+ serverRender_
762
+ { action =
763
+ \routeParams request ->
764
+ actionFn
765
+ |> Maybe.map
766
+ (\justActionFn ->
767
+ justActionFn.call [ routeParams, request ]
768
+ |> Elm.withType (myType "ActionData")
769
+ )
770
+ |> Maybe.withDefault Elm.unit
771
+ , data =
772
+ \routeParams request ->
773
+ dataFn.call [ routeParams, request ]
774
+ |> Elm.withType (myType "Data")
775
+ , head = headFn.call
776
+ }
777
+
778
+ Pages _ ->
779
+ case actionFn of
780
+ Nothing ->
781
+ single_
782
+ { data =
783
+ dataFn.call []
784
+ |> Elm.withType
785
+ (throwableTask
786
+ (Elm.Annotation.named [] "Data")
787
+ )
788
+ , head = headFn.call
789
+ }
790
+
791
+ Just justActionFn ->
792
+ preRender_
793
+ { pages = justActionFn.call []
794
+ , data =
795
+ \routeParams ->
796
+ dataFn.call [ routeParams ]
797
+ |> Elm.withType
798
+ (throwableTask (Elm.Annotation.named [] "Data"))
799
+ , head = headFn.call
800
+ }
801
+ )
802
+ |> (case localDefinitions of
803
+ Just local ->
804
+ buildWithLocalState_
805
+ { view = viewFn.call
806
+ , update = local.updateFn.call
807
+ , init = local.initFn.call
808
+ , subscriptions = local.subscriptionsFn.call
809
+ , state = local.state
810
+ }
811
+ >> Elm.withType
812
+ (Elm.Annotation.namedWith [ "RouteBuilder" ]
813
+ "StatefulRoute"
814
+ [ localType "RouteParams"
815
+ , localType "Data"
816
+ , localType "ActionData"
817
+ , localType "Model"
818
+ , localType "Msg"
819
+ ]
820
+ )
821
+
822
+ Nothing ->
823
+ buildNoState_
824
+ { view = \app shared -> viewFn.call app shared Elm.unit
825
+ }
826
+ >> Elm.withType
827
+ (Elm.Annotation.namedWith [ "RouteBuilder" ]
828
+ "StatelessRoute"
829
+ [ localType "RouteParams"
830
+ , localType "Data"
831
+ , localType "ActionData"
832
+ ]
833
+ )
834
+ )
835
+ )
836
+ |> Elm.expose
837
+ ]
838
+ ++ (case localDefinitions of
839
+ Just local ->
840
+ [ local.initFn.declaration
841
+ , local.updateFn.declaration
842
+ , local.subscriptionsFn.declaration
843
+ ]
844
+
845
+ Nothing ->
846
+ []
847
+ )
848
+ ++ [ definitions.types.data |> typeToDeclaration "Data" |> Elm.expose
849
+ , definitions.types.actionData |> typeToDeclaration "ActionData" |> Elm.expose
850
+ , dataFn.declaration
851
+ , headFn.declaration
852
+ , viewFn.declaration
853
+ ]
854
+ ++ ([ actionFn |> Maybe.map .declaration
855
+ ]
856
+ |> List.filterMap identity
857
+ )
858
+ ++ definitions.declarations
859
+ )
860
+ |> (\{ path, contents } ->
861
+ { path = "app/" ++ path
862
+ , body = contents
863
+ }
864
+ )
865
+
866
+
867
+ localType : String -> Elm.Annotation.Annotation
868
+ localType =
869
+ Elm.Annotation.named []
870
+
871
+
872
+ myType : String -> Elm.Annotation.Annotation
873
+ myType dataType =
874
+ --Elm.Annotation.function
875
+ -- [ Elm.Annotation.namedWith [ "Server", "Request" ]
876
+ -- "Request"
877
+ -- []
878
+ -- ]
879
+ throwableTask
880
+ (Elm.Annotation.namedWith [ "Server", "Response" ]
881
+ "Response"
882
+ [ Elm.Annotation.named [] dataType
883
+ , Elm.Annotation.named [ "ErrorPage" ] "ErrorPage"
884
+ ]
885
+ )
886
+
887
+
888
+ appType : Elm.Annotation.Annotation
889
+ appType =
890
+ Elm.Annotation.namedWith [ "RouteBuilder" ]
891
+ "App"
892
+ [ Elm.Annotation.named [] "Data"
893
+ , Elm.Annotation.named [] "ActionData"
894
+ , Elm.Annotation.named [] "RouteParams"
895
+ ]
896
+
897
+
898
+ serverRender_ :
899
+ { data : Elm.Expression -> Elm.Expression -> Elm.Expression
900
+ , action : Elm.Expression -> Elm.Expression -> Elm.Expression
901
+ , head : Elm.Expression -> Elm.Expression
902
+ }
903
+ -> Elm.Expression
904
+ serverRender_ serverRenderArg =
905
+ Elm.apply
906
+ (Elm.value
907
+ { importFrom = [ "RouteBuilder" ]
908
+ , name = "serverRender"
909
+ , annotation =
910
+ Just
911
+ (Elm.Annotation.function
912
+ [ Elm.Annotation.record
913
+ [ ( "data"
914
+ , Elm.Annotation.function
915
+ [ Elm.Annotation.var "routeParams" ]
916
+ (Elm.Annotation.namedWith
917
+ [ "Server", "Request" ]
918
+ "Parser"
919
+ [ throwableTask
920
+ (Elm.Annotation.namedWith
921
+ [ "Server", "Response" ]
922
+ "Response"
923
+ [ Elm.Annotation.var "data"
924
+ , Elm.Annotation.namedWith
925
+ [ "ErrorPage" ]
926
+ "ErrorPage"
927
+ []
928
+ ]
929
+ )
930
+ ]
931
+ )
932
+ )
933
+ , ( "action"
934
+ , Elm.Annotation.function
935
+ [ Elm.Annotation.var "routeParams"
936
+ , Elm.Annotation.named [ "Server", "Request" ] "Request"
937
+ ]
938
+ (throwableTask
939
+ (Elm.Annotation.namedWith
940
+ [ "Server", "Response" ]
941
+ "Response"
942
+ [ Elm.Annotation.var "action"
943
+ , Elm.Annotation.namedWith
944
+ [ "ErrorPage" ]
945
+ "ErrorPage"
946
+ []
947
+ ]
948
+ )
949
+ )
950
+ )
951
+ , ( "head"
952
+ , Elm.Annotation.function
953
+ [ Elm.Annotation.namedWith
954
+ [ "RouteBuilder" ]
955
+ "App"
956
+ [ Elm.Annotation.var "data"
957
+ , Elm.Annotation.var "action"
958
+ , Elm.Annotation.var "routeParams"
959
+ ]
960
+ ]
961
+ (Elm.Annotation.list
962
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
963
+ )
964
+ )
965
+ ]
966
+ ]
967
+ (Elm.Annotation.namedWith
968
+ [ "RouteBuilder" ]
969
+ "Builder"
970
+ [ Elm.Annotation.var "routeParams"
971
+ , Elm.Annotation.var "data"
972
+ , Elm.Annotation.var "action"
973
+ ]
974
+ )
975
+ )
976
+ }
977
+ )
978
+ [ Elm.record
979
+ [ Tuple.pair
980
+ "data"
981
+ (Elm.functionReduced
982
+ "dataUnpack"
983
+ (\functionReducedUnpack ->
984
+ Elm.functionReduced "dataUnpack2" (serverRenderArg.data functionReducedUnpack)
985
+ )
986
+ )
987
+ , Tuple.pair
988
+ "action"
989
+ (Elm.functionReduced
990
+ "actionUnpack"
991
+ (\functionReducedUnpack ->
992
+ Elm.functionReduced "actionUnpack2" (serverRenderArg.action functionReducedUnpack)
993
+ )
994
+ )
995
+ , Tuple.pair
996
+ "head"
997
+ (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
998
+ ]
999
+ ]
1000
+
1001
+
1002
+ preRender_ :
1003
+ { data : Elm.Expression -> Elm.Expression
1004
+ , pages : Elm.Expression
1005
+ , head : Elm.Expression -> Elm.Expression
1006
+ }
1007
+ -> Elm.Expression
1008
+ preRender_ serverRenderArg =
1009
+ Elm.apply
1010
+ (Elm.value
1011
+ { importFrom = [ "RouteBuilder" ]
1012
+ , name = "preRender"
1013
+ , annotation =
1014
+ Just
1015
+ (Elm.Annotation.function
1016
+ [ Elm.Annotation.record
1017
+ [ ( "data"
1018
+ , Elm.Annotation.function
1019
+ [ Elm.Annotation.var "routeParams" ]
1020
+ (throwableTask (Elm.Annotation.var "data"))
1021
+ )
1022
+ , ( "pages"
1023
+ , throwableTask
1024
+ (Elm.Annotation.list (Elm.Annotation.named [] "RouteParams"))
1025
+ )
1026
+ , ( "head"
1027
+ , Elm.Annotation.function
1028
+ [ Elm.Annotation.namedWith
1029
+ [ "RouteBuilder" ]
1030
+ "App"
1031
+ [ Elm.Annotation.var "data"
1032
+ , Elm.Annotation.var "action"
1033
+ , Elm.Annotation.var "routeParams"
1034
+ ]
1035
+ ]
1036
+ (Elm.Annotation.list
1037
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
1038
+ )
1039
+ )
1040
+ ]
1041
+ ]
1042
+ (Elm.Annotation.namedWith
1043
+ [ "RouteBuilder" ]
1044
+ "Builder"
1045
+ [ Elm.Annotation.named [] "RouteParams"
1046
+ , Elm.Annotation.named [] "Data"
1047
+ , Elm.Annotation.named [] "Action"
1048
+ ]
1049
+ )
1050
+ )
1051
+ }
1052
+ )
1053
+ [ Elm.record
1054
+ [ Tuple.pair "data" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.data)
1055
+ , Tuple.pair "pages" serverRenderArg.pages
1056
+ , Tuple.pair "head" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
1057
+ ]
1058
+ ]
1059
+
1060
+
1061
+ single_ :
1062
+ { data : Elm.Expression
1063
+ , head : Elm.Expression -> Elm.Expression
1064
+ }
1065
+ -> Elm.Expression
1066
+ single_ serverRenderArg =
1067
+ Elm.apply
1068
+ (Elm.value
1069
+ { importFrom = [ "RouteBuilder" ]
1070
+ , name = "single"
1071
+ , annotation =
1072
+ Just
1073
+ (Elm.Annotation.function
1074
+ [ Elm.Annotation.record
1075
+ [ ( "data"
1076
+ , throwableTask (Elm.Annotation.var "data")
1077
+ )
1078
+ , ( "head"
1079
+ , Elm.Annotation.function
1080
+ [ Elm.Annotation.namedWith
1081
+ [ "RouteBuilder" ]
1082
+ "App"
1083
+ [ Elm.Annotation.var "data"
1084
+ , Elm.Annotation.var "action"
1085
+ , Elm.Annotation.var "routeParams"
1086
+ ]
1087
+ ]
1088
+ (Elm.Annotation.list
1089
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
1090
+ )
1091
+ )
1092
+ ]
1093
+ ]
1094
+ (Elm.Annotation.namedWith
1095
+ [ "RouteBuilder" ]
1096
+ "Builder"
1097
+ [ Elm.Annotation.named [] "RouteParams"
1098
+ , Elm.Annotation.named [] "Data"
1099
+ , Elm.Annotation.named [] "Action"
1100
+ ]
1101
+ )
1102
+ )
1103
+ }
1104
+ )
1105
+ [ Elm.record
1106
+ [ Tuple.pair "data" serverRenderArg.data
1107
+ , Tuple.pair "head" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
1108
+ ]
1109
+ ]
1110
+
1111
+
1112
+ buildWithLocalState_ :
1113
+ { view :
1114
+ Elm.Expression
1115
+ -> Elm.Expression
1116
+ -> Elm.Expression
1117
+ -> Elm.Expression
1118
+ , init :
1119
+ Elm.Expression -> Elm.Expression -> Elm.Expression
1120
+ , update :
1121
+ Elm.Expression
1122
+ -> Elm.Expression
1123
+ -> Elm.Expression
1124
+ -> Elm.Expression
1125
+ -> Elm.Expression
1126
+ , subscriptions :
1127
+ Elm.Expression
1128
+ -> Elm.Expression
1129
+ -> Elm.Expression
1130
+ -> Elm.Expression
1131
+ -> Elm.Expression
1132
+ , state : State
1133
+ }
1134
+ -> Elm.Expression
1135
+ -> Elm.Expression
1136
+ buildWithLocalState_ buildWithLocalStateArg buildWithLocalStateArg0 =
1137
+ Elm.Op.pipe
1138
+ (Elm.apply
1139
+ (Elm.value
1140
+ { importFrom = [ "RouteBuilder" ]
1141
+ , name =
1142
+ case buildWithLocalStateArg.state of
1143
+ LocalState ->
1144
+ "buildWithLocalState"
1145
+
1146
+ SharedState ->
1147
+ "buildWithSharedState"
1148
+ , annotation =
1149
+ Just
1150
+ (Elm.Annotation.function
1151
+ [ Elm.Annotation.record
1152
+ [ ( "view"
1153
+ , Elm.Annotation.function
1154
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1155
+ , Elm.Annotation.var "model"
1156
+ , Elm.Annotation.namedWith
1157
+ [ "RouteBuilder" ]
1158
+ "App"
1159
+ [ Elm.Annotation.var "data"
1160
+ , Elm.Annotation.var "action"
1161
+ , Elm.Annotation.var "routeParams"
1162
+ ]
1163
+ ]
1164
+ (Elm.Annotation.namedWith
1165
+ [ "View" ]
1166
+ "View"
1167
+ [ Elm.Annotation.namedWith
1168
+ [ "PagesMsg" ]
1169
+ "PagesMsg"
1170
+ [ Elm.Annotation.named [] "Msg" ]
1171
+ ]
1172
+ )
1173
+ )
1174
+ , ( "init"
1175
+ , Elm.Annotation.function
1176
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1177
+ , Elm.Annotation.namedWith
1178
+ [ "RouteBuilder" ]
1179
+ "App"
1180
+ [ Elm.Annotation.var "data"
1181
+ , Elm.Annotation.var "action"
1182
+ , Elm.Annotation.var "routeParams"
1183
+ ]
1184
+ ]
1185
+ (Elm.Annotation.tuple
1186
+ (Elm.Annotation.named [] "Model")
1187
+ (Elm.Annotation.namedWith
1188
+ [ "Effect" ]
1189
+ "Effect"
1190
+ [ Elm.Annotation.named [] "Msg" ]
1191
+ )
1192
+ )
1193
+ )
1194
+ , ( "update"
1195
+ , Elm.Annotation.function
1196
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1197
+ , Elm.Annotation.namedWith
1198
+ [ "RouteBuilder" ]
1199
+ "App"
1200
+ [ localType "Data"
1201
+ , localType "ActionData"
1202
+ , localType "RouteParams"
1203
+ ]
1204
+ , Elm.Annotation.named [] "Msg"
1205
+ , Elm.Annotation.named [] "Model"
1206
+ ]
1207
+ (case buildWithLocalStateArg.state of
1208
+ LocalState ->
1209
+ Elm.Annotation.tuple
1210
+ (localType "Model")
1211
+ (Elm.Annotation.namedWith
1212
+ [ "Effect" ]
1213
+ "Effect"
1214
+ [ localType "Msg" ]
1215
+ )
1216
+
1217
+ SharedState ->
1218
+ Elm.Annotation.triple
1219
+ (localType "Model")
1220
+ (Elm.Annotation.namedWith
1221
+ [ "Effect" ]
1222
+ "Effect"
1223
+ [ localType "Msg" ]
1224
+ )
1225
+ (Elm.Annotation.maybe (Elm.Annotation.named [ "Shared" ] "Msg"))
1226
+ )
1227
+ )
1228
+ , ( "subscriptions"
1229
+ , Elm.Annotation.function
1230
+ [ Elm.Annotation.var "routeParams"
1231
+ , Elm.Annotation.namedWith [ "UrlPath" ] "UrlPath" []
1232
+ , Elm.Annotation.namedWith [ "Shared" ] "Model" []
1233
+ , Elm.Annotation.var "model"
1234
+ ]
1235
+ (Elm.Annotation.namedWith [] "Sub" [ localType "Msg" ])
1236
+ )
1237
+ ]
1238
+ , Elm.Annotation.namedWith
1239
+ [ "RouteBuilder" ]
1240
+ "Builder"
1241
+ [ localType "RouteParams"
1242
+ , localType "Data"
1243
+ , localType "ActionData"
1244
+ ]
1245
+ ]
1246
+ (Elm.Annotation.namedWith
1247
+ [ "RouteBuilder" ]
1248
+ "StatefulRoute"
1249
+ [ localType "RouteParams"
1250
+ , localType "Data"
1251
+ , localType "ActionData"
1252
+ , localType "Model"
1253
+ , localType "Msg"
1254
+ ]
1255
+ )
1256
+ )
1257
+ }
1258
+ )
1259
+ [ Elm.record
1260
+ [ Tuple.pair
1261
+ "view"
1262
+ (Elm.functionReduced
1263
+ "buildWithLocalStateUnpack"
1264
+ (\functionReducedUnpack ->
1265
+ Elm.functionReduced
1266
+ "unpack"
1267
+ (\functionReducedUnpack_2_1_2_0_2_2_0_1_0_2_0_0 ->
1268
+ Elm.functionReduced
1269
+ "unpack"
1270
+ (buildWithLocalStateArg.view
1271
+ functionReducedUnpack
1272
+ functionReducedUnpack_2_1_2_0_2_2_0_1_0_2_0_0
1273
+ )
1274
+ )
1275
+ )
1276
+ )
1277
+ , Tuple.pair
1278
+ "init"
1279
+ (Elm.functionReduced
1280
+ "buildWithLocalStateUnpack"
1281
+ (\functionReducedUnpack ->
1282
+ Elm.functionReduced
1283
+ "unpack"
1284
+ (buildWithLocalStateArg.init
1285
+ functionReducedUnpack
1286
+ )
1287
+ )
1288
+ )
1289
+ , Tuple.pair
1290
+ "update"
1291
+ (Elm.functionReduced
1292
+ "buildWithLocalStateUnpack"
1293
+ (\functionReducedUnpack ->
1294
+ Elm.functionReduced
1295
+ "unpack"
1296
+ (\functionReducedUnpack_2_1_2_0_2_2_2_1_0_2_0_0 ->
1297
+ Elm.functionReduced
1298
+ "unpack"
1299
+ (\functionReducedUnpack_2_1_2_1_2_0_2_2_2_1_0_2_0_0 ->
1300
+ Elm.functionReduced
1301
+ "unpack"
1302
+ (buildWithLocalStateArg.update
1303
+ functionReducedUnpack
1304
+ functionReducedUnpack_2_1_2_0_2_2_2_1_0_2_0_0
1305
+ functionReducedUnpack_2_1_2_1_2_0_2_2_2_1_0_2_0_0
1306
+ )
1307
+ )
1308
+ )
1309
+ )
1310
+ )
1311
+ , Tuple.pair
1312
+ "subscriptions"
1313
+ (Elm.functionReduced
1314
+ "buildWithLocalStateUnpack"
1315
+ (\functionReducedUnpack ->
1316
+ Elm.functionReduced
1317
+ "unpack"
1318
+ (\functionReducedUnpack_2_1_2_0_2_2_3_1_0_2_0_0 ->
1319
+ Elm.functionReduced
1320
+ "unpack"
1321
+ (\functionReducedUnpack_2_1_2_1_2_0_2_2_3_1_0_2_0_0 ->
1322
+ Elm.functionReduced
1323
+ "unpack"
1324
+ (buildWithLocalStateArg.subscriptions
1325
+ functionReducedUnpack
1326
+ functionReducedUnpack_2_1_2_0_2_2_3_1_0_2_0_0
1327
+ functionReducedUnpack_2_1_2_1_2_0_2_2_3_1_0_2_0_0
1328
+ )
1329
+ )
1330
+ )
1331
+ )
1332
+ )
1333
+ ]
1334
+ ]
1335
+ )
1336
+ buildWithLocalStateArg0
1337
+
1338
+
1339
+ buildNoState_ :
1340
+ { view :
1341
+ Elm.Expression -> Elm.Expression -> Elm.Expression
1342
+ }
1343
+ -> Elm.Expression
1344
+ -> Elm.Expression
1345
+ buildNoState_ buildNoStateArg buildNoStateArg0 =
1346
+ Elm.Op.pipe
1347
+ (Elm.apply
1348
+ (Elm.value
1349
+ { importFrom = [ "RouteBuilder" ]
1350
+ , name = "buildNoState"
1351
+ , annotation =
1352
+ Just
1353
+ (Elm.Annotation.function
1354
+ [ Elm.Annotation.record
1355
+ [ ( "view"
1356
+ , Elm.Annotation.function
1357
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1358
+ , Elm.Annotation.namedWith
1359
+ [ "RouteBuilder" ]
1360
+ "App"
1361
+ [ Elm.Annotation.named [] "Data"
1362
+ , Elm.Annotation.named [] "ActionData"
1363
+ , Elm.Annotation.named [] "RouteParams"
1364
+ ]
1365
+ ]
1366
+ (Elm.Annotation.namedWith
1367
+ [ "View" ]
1368
+ "View"
1369
+ [ Elm.Annotation.namedWith
1370
+ [ "PagesMsg" ]
1371
+ "PagesMsg"
1372
+ [ Elm.Annotation.named [] "Msg" ]
1373
+ ]
1374
+ )
1375
+ )
1376
+ ]
1377
+ , Elm.Annotation.namedWith
1378
+ [ "RouteBuilder" ]
1379
+ "Builder"
1380
+ [ Elm.Annotation.named [] "RouteParams"
1381
+ , Elm.Annotation.named [] "Data"
1382
+ , Elm.Annotation.named [] "ActionData"
1383
+ ]
1384
+ ]
1385
+ (Elm.Annotation.namedWith
1386
+ [ "RouteBuilder" ]
1387
+ "StatefulRoute"
1388
+ [ Elm.Annotation.named [] "RouteParams"
1389
+ , Elm.Annotation.named [] "Data"
1390
+ , Elm.Annotation.named [] "ActionData"
1391
+ , Elm.Annotation.record []
1392
+ , Elm.Annotation.unit
1393
+ ]
1394
+ )
1395
+ )
1396
+ }
1397
+ )
1398
+ [ Elm.record
1399
+ [ Tuple.pair
1400
+ "view"
1401
+ (Elm.functionReduced
1402
+ "unpack"
1403
+ (\functionReducedUnpack0 ->
1404
+ Elm.functionReduced
1405
+ "unpack"
1406
+ (buildNoStateArg.view
1407
+ functionReducedUnpack0
1408
+ )
1409
+ )
1410
+ )
1411
+ ]
1412
+ ]
1413
+ )
1414
+ buildNoStateArg0
1415
+
1416
+
1417
+ effectType : Elm.Annotation.Annotation
1418
+ effectType =
1419
+ Elm.Annotation.namedWith
1420
+ [ "Effect" ]
1421
+ "Effect"
1422
+ [ Elm.Annotation.named [] "Msg" ]
1423
+
1424
+
1425
+ throwableTask : Elm.Annotation.Annotation -> Elm.Annotation.Annotation
1426
+ throwableTask dataType =
1427
+ Elm.Annotation.namedWith [ "BackendTask" ]
1428
+ "BackendTask"
1429
+ [ Elm.Annotation.named [ "FatalError" ] "FatalError"
1430
+ , dataType
1431
+ ]