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.
Files changed (148) 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} +2828 -2933
  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 +121 -114
  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 +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 +531 -0
  86. package/src/FatalError.elm +90 -0
  87. package/src/Head/Seo.elm +4 -4
  88. package/src/Head.elm +237 -7
  89. package/src/HtmlPrinter.elm +7 -3
  90. package/src/Internal/ApiRoute.elm +7 -5
  91. package/src/PageServerResponse.elm +6 -1
  92. package/src/Pages/ConcurrentSubmission.elm +127 -0
  93. package/src/Pages/Form.elm +340 -0
  94. package/src/Pages/FormData.elm +18 -0
  95. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  96. package/src/Pages/Internal/FatalError.elm +5 -0
  97. package/src/Pages/Internal/Msg.elm +93 -0
  98. package/src/Pages/Internal/NotFoundReason.elm +4 -4
  99. package/src/Pages/Internal/Platform/Cli.elm +617 -768
  100. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  101. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  102. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  103. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  104. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  105. package/src/Pages/Internal/Platform.elm +359 -225
  106. package/src/Pages/Internal/ResponseSketch.elm +2 -2
  107. package/src/Pages/Internal/Script.elm +17 -0
  108. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  109. package/src/Pages/Manifest.elm +52 -11
  110. package/src/Pages/Navigation.elm +87 -0
  111. package/src/Pages/PageUrl.elm +26 -12
  112. package/src/Pages/ProgramConfig.elm +35 -23
  113. package/src/Pages/Script.elm +166 -0
  114. package/src/Pages/SiteConfig.elm +3 -2
  115. package/src/Pages/StaticHttp/Request.elm +2 -2
  116. package/src/Pages/StaticHttpRequest.elm +23 -99
  117. package/src/Pages/Url.elm +3 -3
  118. package/src/PagesMsg.elm +88 -0
  119. package/src/QueryParams.elm +21 -172
  120. package/src/RenderRequest.elm +7 -7
  121. package/src/RequestsAndPending.elm +37 -20
  122. package/src/Result/Extra.elm +26 -0
  123. package/src/Scaffold/Form.elm +569 -0
  124. package/src/Scaffold/Route.elm +1411 -0
  125. package/src/Server/Request.elm +74 -72
  126. package/src/Server/Session.elm +62 -42
  127. package/src/Server/SetCookie.elm +80 -32
  128. package/src/Stub.elm +53 -0
  129. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  130. package/src/{Path.elm → UrlPath.elm} +33 -36
  131. package/src/DataSource/Env.elm +0 -38
  132. package/src/DataSource/Http.elm +0 -446
  133. package/src/DataSource/Internal/Request.elm +0 -20
  134. package/src/DataSource/Port.elm +0 -90
  135. package/src/DataSource.elm +0 -538
  136. package/src/Form/Field.elm +0 -717
  137. package/src/Form/FieldStatus.elm +0 -36
  138. package/src/Form/FieldView.elm +0 -417
  139. package/src/Form/FormData.elm +0 -22
  140. package/src/Form/Validation.elm +0 -391
  141. package/src/Form/Value.elm +0 -118
  142. package/src/Form.elm +0 -1683
  143. package/src/FormDecoder.elm +0 -102
  144. package/src/Pages/FormState.elm +0 -256
  145. package/src/Pages/Generate.elm +0 -800
  146. package/src/Pages/Internal/Form.elm +0 -17
  147. package/src/Pages/Msg.elm +0 -79
  148. package/src/Pages/Transition.elm +0 -70
@@ -0,0 +1,1411 @@
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-v3.netlify.app/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 )
96
+ , action : ( Type, 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 )
112
+ , action : ( Type, 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
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
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
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)
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
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 [ "Path" ] "Path" [] |> 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
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
+ ]
678
+ (\args ->
679
+ case args of
680
+ [ arg ] ->
681
+ definitions.data arg
682
+ |> Elm.withType
683
+ (case definitions.action of
684
+ Pages _ ->
685
+ throwableTask (Elm.Annotation.named [] "Data")
686
+
687
+ Action _ ->
688
+ myType "Data"
689
+ )
690
+
691
+ _ ->
692
+ Elm.unit
693
+ )
694
+
695
+ actionFn : Maybe { declaration : Elm.Declaration, call : List Elm.Expression -> Elm.Expression, callFrom : List String -> List Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }
696
+ actionFn =
697
+ case definitions.action of
698
+ Action action_ ->
699
+ Elm.Declare.function "action"
700
+ [ ( "routeParams"
701
+ , "RouteParams"
702
+ |> Elm.Annotation.named []
703
+ |> Just
704
+ )
705
+ ]
706
+ (\args ->
707
+ case args of
708
+ [ arg ] ->
709
+ action_ arg |> Elm.withType (myType "ActionData")
710
+
711
+ _ ->
712
+ Elm.unit
713
+ )
714
+ |> Just
715
+
716
+ Pages pages_ ->
717
+ pages_
718
+ |> Maybe.map
719
+ (\justPagesExpression ->
720
+ Elm.Declare.function "pages"
721
+ []
722
+ (\_ -> justPagesExpression)
723
+ )
724
+
725
+ headFn : { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }
726
+ headFn =
727
+ Elm.Declare.fn "head"
728
+ ( "app", Just appType )
729
+ (definitions.head
730
+ >> Elm.withType
731
+ (Elm.Annotation.list
732
+ (Elm.Annotation.named [ "Head" ] "Tag")
733
+ )
734
+ )
735
+ in
736
+ Elm.file ("Route" :: moduleName)
737
+ ([ definitions.types.model |> typeToDeclaration "Model" |> Elm.expose
738
+ , definitions.types.msg |> typeToDeclaration "Msg" |> Elm.expose
739
+ , Elm.alias "RouteParams"
740
+ (Elm.Annotation.record
741
+ (RoutePattern.fromModuleName moduleName
742
+ -- TODO give error if not parseable here
743
+ |> Maybe.map RoutePattern.toRouteParamsRecord
744
+ |> Maybe.withDefault []
745
+ )
746
+ )
747
+ |> Elm.expose
748
+ , Elm.declaration "route"
749
+ ((case definitions.action of
750
+ Action _ ->
751
+ serverRender_
752
+ { action =
753
+ \routeParams ->
754
+ actionFn
755
+ |> Maybe.map
756
+ (\justActionFn ->
757
+ justActionFn.call [ routeParams ]
758
+ |> Elm.withType (myType "ActionData")
759
+ )
760
+ |> Maybe.withDefault Elm.unit
761
+ , data =
762
+ \routeParams ->
763
+ dataFn.call [ routeParams ]
764
+ |> Elm.withType (myType "Data")
765
+ , head = headFn.call
766
+ }
767
+
768
+ Pages _ ->
769
+ case actionFn of
770
+ Nothing ->
771
+ single_
772
+ { data =
773
+ dataFn.call []
774
+ |> Elm.withType
775
+ (throwableTask
776
+ (Elm.Annotation.named [] "Data")
777
+ )
778
+ , head = headFn.call
779
+ }
780
+
781
+ Just justActionFn ->
782
+ preRender_
783
+ { pages = justActionFn.call []
784
+ , data =
785
+ \routeParams ->
786
+ dataFn.call [ routeParams ]
787
+ |> Elm.withType
788
+ (throwableTask (Elm.Annotation.named [] "Data"))
789
+ , head = headFn.call
790
+ }
791
+ )
792
+ |> (case localDefinitions of
793
+ Just local ->
794
+ buildWithLocalState_
795
+ { view = viewFn.call
796
+ , update = local.updateFn.call
797
+ , init = local.initFn.call
798
+ , subscriptions = local.subscriptionsFn.call
799
+ , state = local.state
800
+ }
801
+ >> Elm.withType
802
+ (Elm.Annotation.namedWith [ "RouteBuilder" ]
803
+ "StatefulRoute"
804
+ [ localType "RouteParams"
805
+ , localType "Data"
806
+ , localType "ActionData"
807
+ , localType "Model"
808
+ , localType "Msg"
809
+ ]
810
+ )
811
+
812
+ Nothing ->
813
+ buildNoState_
814
+ { view = \app shared -> viewFn.call app shared Elm.unit
815
+ }
816
+ >> Elm.withType
817
+ (Elm.Annotation.namedWith [ "RouteBuilder" ]
818
+ "StatelessRoute"
819
+ [ localType "RouteParams"
820
+ , localType "Data"
821
+ , localType "ActionData"
822
+ ]
823
+ )
824
+ )
825
+ )
826
+ |> Elm.expose
827
+ ]
828
+ ++ (case localDefinitions of
829
+ Just local ->
830
+ [ local.initFn.declaration
831
+ , local.updateFn.declaration
832
+ , local.subscriptionsFn.declaration
833
+ ]
834
+
835
+ Nothing ->
836
+ []
837
+ )
838
+ ++ [ definitions.types.data |> typeToDeclaration "Data" |> Elm.expose
839
+ , definitions.types.actionData |> typeToDeclaration "ActionData" |> Elm.expose
840
+ , dataFn.declaration
841
+ , headFn.declaration
842
+ , viewFn.declaration
843
+ ]
844
+ ++ ([ actionFn |> Maybe.map .declaration
845
+ ]
846
+ |> List.filterMap identity
847
+ )
848
+ ++ definitions.declarations
849
+ )
850
+ |> (\{ path, contents } ->
851
+ { path = "app/" ++ path
852
+ , body = contents
853
+ }
854
+ )
855
+
856
+
857
+ localType : String -> Elm.Annotation.Annotation
858
+ localType =
859
+ Elm.Annotation.named []
860
+
861
+
862
+ myType : String -> Elm.Annotation.Annotation
863
+ myType dataType =
864
+ Elm.Annotation.namedWith [ "Server", "Request" ]
865
+ "Parser"
866
+ [ throwableTask
867
+ (Elm.Annotation.namedWith [ "Server", "Response" ]
868
+ "Response"
869
+ [ Elm.Annotation.named [] dataType
870
+ , Elm.Annotation.named [ "ErrorPage" ] "ErrorPage"
871
+ ]
872
+ )
873
+ ]
874
+
875
+
876
+ appType : Elm.Annotation.Annotation
877
+ appType =
878
+ Elm.Annotation.namedWith [ "RouteBuilder" ]
879
+ "App"
880
+ [ Elm.Annotation.named [] "Data"
881
+ , Elm.Annotation.named [] "ActionData"
882
+ , Elm.Annotation.named [] "RouteParams"
883
+ ]
884
+
885
+
886
+ serverRender_ :
887
+ { data : Elm.Expression -> Elm.Expression
888
+ , action : Elm.Expression -> Elm.Expression
889
+ , head : Elm.Expression -> Elm.Expression
890
+ }
891
+ -> Elm.Expression
892
+ serverRender_ serverRenderArg =
893
+ Elm.apply
894
+ (Elm.value
895
+ { importFrom = [ "RouteBuilder" ]
896
+ , name = "serverRender"
897
+ , annotation =
898
+ Just
899
+ (Elm.Annotation.function
900
+ [ Elm.Annotation.record
901
+ [ ( "data"
902
+ , Elm.Annotation.function
903
+ [ Elm.Annotation.var "routeParams" ]
904
+ (Elm.Annotation.namedWith
905
+ [ "Server", "Request" ]
906
+ "Parser"
907
+ [ throwableTask
908
+ (Elm.Annotation.namedWith
909
+ [ "Server", "Response" ]
910
+ "Response"
911
+ [ Elm.Annotation.var "data"
912
+ , Elm.Annotation.namedWith
913
+ [ "ErrorPage" ]
914
+ "ErrorPage"
915
+ []
916
+ ]
917
+ )
918
+ ]
919
+ )
920
+ )
921
+ , ( "action"
922
+ , Elm.Annotation.function
923
+ [ Elm.Annotation.var "routeParams" ]
924
+ (Elm.Annotation.namedWith
925
+ [ "Server", "Request" ]
926
+ "Parser"
927
+ [ throwableTask
928
+ (Elm.Annotation.namedWith
929
+ [ "Server", "Response" ]
930
+ "Response"
931
+ [ Elm.Annotation.var "action"
932
+ , Elm.Annotation.namedWith
933
+ [ "ErrorPage" ]
934
+ "ErrorPage"
935
+ []
936
+ ]
937
+ )
938
+ ]
939
+ )
940
+ )
941
+ , ( "head"
942
+ , Elm.Annotation.function
943
+ [ Elm.Annotation.namedWith
944
+ [ "RouteBuilder" ]
945
+ "App"
946
+ [ Elm.Annotation.var "data"
947
+ , Elm.Annotation.var "action"
948
+ , Elm.Annotation.var "routeParams"
949
+ ]
950
+ ]
951
+ (Elm.Annotation.list
952
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
953
+ )
954
+ )
955
+ ]
956
+ ]
957
+ (Elm.Annotation.namedWith
958
+ [ "RouteBuilder" ]
959
+ "Builder"
960
+ [ Elm.Annotation.var "routeParams"
961
+ , Elm.Annotation.var "data"
962
+ , Elm.Annotation.var "action"
963
+ ]
964
+ )
965
+ )
966
+ }
967
+ )
968
+ [ Elm.record
969
+ [ Tuple.pair
970
+ "data"
971
+ (Elm.functionReduced "serverRenderUnpack" serverRenderArg.data)
972
+ , Tuple.pair
973
+ "action"
974
+ (Elm.functionReduced "serverRenderUnpack" serverRenderArg.action)
975
+ , Tuple.pair
976
+ "head"
977
+ (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
978
+ ]
979
+ ]
980
+
981
+
982
+ preRender_ :
983
+ { data : Elm.Expression -> Elm.Expression
984
+ , pages : Elm.Expression
985
+ , head : Elm.Expression -> Elm.Expression
986
+ }
987
+ -> Elm.Expression
988
+ preRender_ serverRenderArg =
989
+ Elm.apply
990
+ (Elm.value
991
+ { importFrom = [ "RouteBuilder" ]
992
+ , name = "preRender"
993
+ , annotation =
994
+ Just
995
+ (Elm.Annotation.function
996
+ [ Elm.Annotation.record
997
+ [ ( "data"
998
+ , Elm.Annotation.function
999
+ [ Elm.Annotation.var "routeParams" ]
1000
+ (throwableTask (Elm.Annotation.var "data"))
1001
+ )
1002
+ , ( "pages"
1003
+ , throwableTask
1004
+ (Elm.Annotation.list (Elm.Annotation.named [] "RouteParams"))
1005
+ )
1006
+ , ( "head"
1007
+ , Elm.Annotation.function
1008
+ [ Elm.Annotation.namedWith
1009
+ [ "RouteBuilder" ]
1010
+ "App"
1011
+ [ Elm.Annotation.var "data"
1012
+ , Elm.Annotation.var "action"
1013
+ , Elm.Annotation.var "routeParams"
1014
+ ]
1015
+ ]
1016
+ (Elm.Annotation.list
1017
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
1018
+ )
1019
+ )
1020
+ ]
1021
+ ]
1022
+ (Elm.Annotation.namedWith
1023
+ [ "RouteBuilder" ]
1024
+ "Builder"
1025
+ [ Elm.Annotation.named [] "RouteParams"
1026
+ , Elm.Annotation.named [] "Data"
1027
+ , Elm.Annotation.named [] "Action"
1028
+ ]
1029
+ )
1030
+ )
1031
+ }
1032
+ )
1033
+ [ Elm.record
1034
+ [ Tuple.pair "data" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.data)
1035
+ , Tuple.pair "pages" serverRenderArg.pages
1036
+ , Tuple.pair "head" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
1037
+ ]
1038
+ ]
1039
+
1040
+
1041
+ single_ :
1042
+ { data : Elm.Expression
1043
+ , head : Elm.Expression -> Elm.Expression
1044
+ }
1045
+ -> Elm.Expression
1046
+ single_ serverRenderArg =
1047
+ Elm.apply
1048
+ (Elm.value
1049
+ { importFrom = [ "RouteBuilder" ]
1050
+ , name = "single"
1051
+ , annotation =
1052
+ Just
1053
+ (Elm.Annotation.function
1054
+ [ Elm.Annotation.record
1055
+ [ ( "data"
1056
+ , throwableTask (Elm.Annotation.var "data")
1057
+ )
1058
+ , ( "head"
1059
+ , Elm.Annotation.function
1060
+ [ Elm.Annotation.namedWith
1061
+ [ "RouteBuilder" ]
1062
+ "App"
1063
+ [ Elm.Annotation.var "data"
1064
+ , Elm.Annotation.var "action"
1065
+ , Elm.Annotation.var "routeParams"
1066
+ ]
1067
+ ]
1068
+ (Elm.Annotation.list
1069
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
1070
+ )
1071
+ )
1072
+ ]
1073
+ ]
1074
+ (Elm.Annotation.namedWith
1075
+ [ "RouteBuilder" ]
1076
+ "Builder"
1077
+ [ Elm.Annotation.named [] "RouteParams"
1078
+ , Elm.Annotation.named [] "Data"
1079
+ , Elm.Annotation.named [] "Action"
1080
+ ]
1081
+ )
1082
+ )
1083
+ }
1084
+ )
1085
+ [ Elm.record
1086
+ [ Tuple.pair "data" serverRenderArg.data
1087
+ , Tuple.pair "head" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
1088
+ ]
1089
+ ]
1090
+
1091
+
1092
+ buildWithLocalState_ :
1093
+ { view :
1094
+ Elm.Expression
1095
+ -> Elm.Expression
1096
+ -> Elm.Expression
1097
+ -> Elm.Expression
1098
+ , init :
1099
+ Elm.Expression -> Elm.Expression -> Elm.Expression
1100
+ , update :
1101
+ Elm.Expression
1102
+ -> Elm.Expression
1103
+ -> Elm.Expression
1104
+ -> Elm.Expression
1105
+ -> Elm.Expression
1106
+ , subscriptions :
1107
+ Elm.Expression
1108
+ -> Elm.Expression
1109
+ -> Elm.Expression
1110
+ -> Elm.Expression
1111
+ -> Elm.Expression
1112
+ , state : State
1113
+ }
1114
+ -> Elm.Expression
1115
+ -> Elm.Expression
1116
+ buildWithLocalState_ buildWithLocalStateArg buildWithLocalStateArg0 =
1117
+ Elm.Op.pipe
1118
+ (Elm.apply
1119
+ (Elm.value
1120
+ { importFrom = [ "RouteBuilder" ]
1121
+ , name =
1122
+ case buildWithLocalStateArg.state of
1123
+ LocalState ->
1124
+ "buildWithLocalState"
1125
+
1126
+ SharedState ->
1127
+ "buildWithSharedState"
1128
+ , annotation =
1129
+ Just
1130
+ (Elm.Annotation.function
1131
+ [ Elm.Annotation.record
1132
+ [ ( "view"
1133
+ , Elm.Annotation.function
1134
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1135
+ , Elm.Annotation.var "model"
1136
+ , Elm.Annotation.namedWith
1137
+ [ "RouteBuilder" ]
1138
+ "App"
1139
+ [ Elm.Annotation.var "data"
1140
+ , Elm.Annotation.var "action"
1141
+ , Elm.Annotation.var "routeParams"
1142
+ ]
1143
+ ]
1144
+ (Elm.Annotation.namedWith
1145
+ [ "View" ]
1146
+ "View"
1147
+ [ Elm.Annotation.namedWith
1148
+ [ "PagesMsg" ]
1149
+ "PagesMsg"
1150
+ [ Elm.Annotation.named [] "Msg" ]
1151
+ ]
1152
+ )
1153
+ )
1154
+ , ( "init"
1155
+ , Elm.Annotation.function
1156
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1157
+ , Elm.Annotation.namedWith
1158
+ [ "RouteBuilder" ]
1159
+ "App"
1160
+ [ Elm.Annotation.var "data"
1161
+ , Elm.Annotation.var "action"
1162
+ , Elm.Annotation.var "routeParams"
1163
+ ]
1164
+ ]
1165
+ (Elm.Annotation.tuple
1166
+ (Elm.Annotation.named [] "Model")
1167
+ (Elm.Annotation.namedWith
1168
+ [ "Effect" ]
1169
+ "Effect"
1170
+ [ Elm.Annotation.named [] "Msg" ]
1171
+ )
1172
+ )
1173
+ )
1174
+ , ( "update"
1175
+ , Elm.Annotation.function
1176
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1177
+ , Elm.Annotation.namedWith
1178
+ [ "RouteBuilder" ]
1179
+ "App"
1180
+ [ localType "Data"
1181
+ , localType "ActionData"
1182
+ , localType "RouteParams"
1183
+ ]
1184
+ , Elm.Annotation.named [] "Msg"
1185
+ , Elm.Annotation.named [] "Model"
1186
+ ]
1187
+ (case buildWithLocalStateArg.state of
1188
+ LocalState ->
1189
+ Elm.Annotation.tuple
1190
+ (localType "Model")
1191
+ (Elm.Annotation.namedWith
1192
+ [ "Effect" ]
1193
+ "Effect"
1194
+ [ localType "Msg" ]
1195
+ )
1196
+
1197
+ SharedState ->
1198
+ Elm.Annotation.triple
1199
+ (localType "Model")
1200
+ (Elm.Annotation.namedWith
1201
+ [ "Effect" ]
1202
+ "Effect"
1203
+ [ localType "Msg" ]
1204
+ )
1205
+ (Elm.Annotation.maybe (Elm.Annotation.named [ "Shared" ] "Msg"))
1206
+ )
1207
+ )
1208
+ , ( "subscriptions"
1209
+ , Elm.Annotation.function
1210
+ [ Elm.Annotation.var "routeParams"
1211
+ , Elm.Annotation.namedWith [ "Path" ] "Path" []
1212
+ , Elm.Annotation.namedWith [ "Shared" ] "Model" []
1213
+ , Elm.Annotation.var "model"
1214
+ ]
1215
+ (Elm.Annotation.namedWith [] "Sub" [ localType "Msg" ])
1216
+ )
1217
+ ]
1218
+ , Elm.Annotation.namedWith
1219
+ [ "RouteBuilder" ]
1220
+ "Builder"
1221
+ [ localType "RouteParams"
1222
+ , localType "Data"
1223
+ , localType "ActionData"
1224
+ ]
1225
+ ]
1226
+ (Elm.Annotation.namedWith
1227
+ [ "RouteBuilder" ]
1228
+ "StatefulRoute"
1229
+ [ localType "RouteParams"
1230
+ , localType "Data"
1231
+ , localType "ActionData"
1232
+ , localType "Model"
1233
+ , localType "Msg"
1234
+ ]
1235
+ )
1236
+ )
1237
+ }
1238
+ )
1239
+ [ Elm.record
1240
+ [ Tuple.pair
1241
+ "view"
1242
+ (Elm.functionReduced
1243
+ "buildWithLocalStateUnpack"
1244
+ (\functionReducedUnpack ->
1245
+ Elm.functionReduced
1246
+ "unpack"
1247
+ (\functionReducedUnpack_2_1_2_0_2_2_0_1_0_2_0_0 ->
1248
+ Elm.functionReduced
1249
+ "unpack"
1250
+ (buildWithLocalStateArg.view
1251
+ functionReducedUnpack
1252
+ functionReducedUnpack_2_1_2_0_2_2_0_1_0_2_0_0
1253
+ )
1254
+ )
1255
+ )
1256
+ )
1257
+ , Tuple.pair
1258
+ "init"
1259
+ (Elm.functionReduced
1260
+ "buildWithLocalStateUnpack"
1261
+ (\functionReducedUnpack ->
1262
+ Elm.functionReduced
1263
+ "unpack"
1264
+ (buildWithLocalStateArg.init
1265
+ functionReducedUnpack
1266
+ )
1267
+ )
1268
+ )
1269
+ , Tuple.pair
1270
+ "update"
1271
+ (Elm.functionReduced
1272
+ "buildWithLocalStateUnpack"
1273
+ (\functionReducedUnpack ->
1274
+ Elm.functionReduced
1275
+ "unpack"
1276
+ (\functionReducedUnpack_2_1_2_0_2_2_2_1_0_2_0_0 ->
1277
+ Elm.functionReduced
1278
+ "unpack"
1279
+ (\functionReducedUnpack_2_1_2_1_2_0_2_2_2_1_0_2_0_0 ->
1280
+ Elm.functionReduced
1281
+ "unpack"
1282
+ (buildWithLocalStateArg.update
1283
+ functionReducedUnpack
1284
+ functionReducedUnpack_2_1_2_0_2_2_2_1_0_2_0_0
1285
+ functionReducedUnpack_2_1_2_1_2_0_2_2_2_1_0_2_0_0
1286
+ )
1287
+ )
1288
+ )
1289
+ )
1290
+ )
1291
+ , Tuple.pair
1292
+ "subscriptions"
1293
+ (Elm.functionReduced
1294
+ "buildWithLocalStateUnpack"
1295
+ (\functionReducedUnpack ->
1296
+ Elm.functionReduced
1297
+ "unpack"
1298
+ (\functionReducedUnpack_2_1_2_0_2_2_3_1_0_2_0_0 ->
1299
+ Elm.functionReduced
1300
+ "unpack"
1301
+ (\functionReducedUnpack_2_1_2_1_2_0_2_2_3_1_0_2_0_0 ->
1302
+ Elm.functionReduced
1303
+ "unpack"
1304
+ (buildWithLocalStateArg.subscriptions
1305
+ functionReducedUnpack
1306
+ functionReducedUnpack_2_1_2_0_2_2_3_1_0_2_0_0
1307
+ functionReducedUnpack_2_1_2_1_2_0_2_2_3_1_0_2_0_0
1308
+ )
1309
+ )
1310
+ )
1311
+ )
1312
+ )
1313
+ ]
1314
+ ]
1315
+ )
1316
+ buildWithLocalStateArg0
1317
+
1318
+
1319
+ buildNoState_ :
1320
+ { view :
1321
+ Elm.Expression -> Elm.Expression -> Elm.Expression
1322
+ }
1323
+ -> Elm.Expression
1324
+ -> Elm.Expression
1325
+ buildNoState_ buildNoStateArg buildNoStateArg0 =
1326
+ Elm.Op.pipe
1327
+ (Elm.apply
1328
+ (Elm.value
1329
+ { importFrom = [ "RouteBuilder" ]
1330
+ , name = "buildNoState"
1331
+ , annotation =
1332
+ Just
1333
+ (Elm.Annotation.function
1334
+ [ Elm.Annotation.record
1335
+ [ ( "view"
1336
+ , Elm.Annotation.function
1337
+ [ Elm.Annotation.namedWith [ "Shared" ] "Model" []
1338
+ , Elm.Annotation.namedWith
1339
+ [ "RouteBuilder" ]
1340
+ "App"
1341
+ [ Elm.Annotation.named [] "Data"
1342
+ , Elm.Annotation.named [] "ActionData"
1343
+ , Elm.Annotation.named [] "RouteParams"
1344
+ ]
1345
+ ]
1346
+ (Elm.Annotation.namedWith
1347
+ [ "View" ]
1348
+ "View"
1349
+ [ Elm.Annotation.namedWith
1350
+ [ "PagesMsg" ]
1351
+ "PagesMsg"
1352
+ [ Elm.Annotation.named [] "Msg" ]
1353
+ ]
1354
+ )
1355
+ )
1356
+ ]
1357
+ , Elm.Annotation.namedWith
1358
+ [ "RouteBuilder" ]
1359
+ "Builder"
1360
+ [ Elm.Annotation.named [] "RouteParams"
1361
+ , Elm.Annotation.named [] "Data"
1362
+ , Elm.Annotation.named [] "ActionData"
1363
+ ]
1364
+ ]
1365
+ (Elm.Annotation.namedWith
1366
+ [ "RouteBuilder" ]
1367
+ "StatefulRoute"
1368
+ [ Elm.Annotation.named [] "RouteParams"
1369
+ , Elm.Annotation.named [] "Data"
1370
+ , Elm.Annotation.named [] "ActionData"
1371
+ , Elm.Annotation.record []
1372
+ , Elm.Annotation.unit
1373
+ ]
1374
+ )
1375
+ )
1376
+ }
1377
+ )
1378
+ [ Elm.record
1379
+ [ Tuple.pair
1380
+ "view"
1381
+ (Elm.functionReduced
1382
+ "unpack"
1383
+ (\functionReducedUnpack0 ->
1384
+ Elm.functionReduced
1385
+ "unpack"
1386
+ (buildNoStateArg.view
1387
+ functionReducedUnpack0
1388
+ )
1389
+ )
1390
+ )
1391
+ ]
1392
+ ]
1393
+ )
1394
+ buildNoStateArg0
1395
+
1396
+
1397
+ effectType : Elm.Annotation.Annotation
1398
+ effectType =
1399
+ Elm.Annotation.namedWith
1400
+ [ "Effect" ]
1401
+ "Effect"
1402
+ [ Elm.Annotation.named [] "Msg" ]
1403
+
1404
+
1405
+ throwableTask : Elm.Annotation.Annotation -> Elm.Annotation.Annotation
1406
+ throwableTask dataType =
1407
+ Elm.Annotation.namedWith [ "BackendTask" ]
1408
+ "BackendTask"
1409
+ [ Elm.Annotation.named [ "FatalError" ] "FatalError"
1410
+ , dataType
1411
+ ]