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

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