elm-pages 3.0.0-beta.3 → 3.0.0-beta.30

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