elm-pages 3.0.0-beta.0 → 3.0.0-beta.10

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 (62) hide show
  1. package/README.md +10 -1
  2. package/codegen/elm-pages-codegen.js +39026 -0
  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.elmi +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/Reporter.elmi +0 -0
  8. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
  9. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
  10. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -0
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  13. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock +0 -0
  14. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  15. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -0
  16. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +6795 -0
  17. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25835 -0
  18. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +110 -0
  19. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +187 -0
  20. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/package.json +1 -0
  21. package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Reporter.elm +26 -0
  22. package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Runner.elm +62 -0
  23. package/generator/dead-code-review/elm.json +35 -0
  24. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +304 -0
  25. package/generator/dead-code-review/src/ReviewConfig.elm +9 -0
  26. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +673 -0
  27. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  28. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  29. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  30. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  31. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +1 -1
  32. package/generator/src/SharedTemplate.elm +1 -1
  33. package/generator/src/build.js +75 -42
  34. package/generator/src/compatibility-key.js +1 -0
  35. package/generator/src/config.js +41 -0
  36. package/generator/src/dev-server.js +36 -56
  37. package/generator/src/generate-template-module-connector.js +2 -28
  38. package/generator/src/pre-render-html.js +31 -17
  39. package/generator/src/render.js +2 -0
  40. package/generator/src/seo-renderer.js +11 -4
  41. package/generator/src/vite-utils.js +78 -0
  42. package/generator/template/app/Api.elm +1 -1
  43. package/generator/template/app/Site.elm +6 -1
  44. package/package.json +5 -3
  45. package/src/ApiRoute.elm +0 -3
  46. package/src/DataSource/File.elm +1 -1
  47. package/src/DataSource/Internal/Request.elm +0 -5
  48. package/src/DataSource.elm +39 -31
  49. package/src/Form/Field.elm +1 -1
  50. package/src/Form.elm +1 -1
  51. package/src/Head/Seo.elm +16 -27
  52. package/src/Head.elm +126 -0
  53. package/src/HtmlPrinter.elm +7 -3
  54. package/src/Pages/Generate.elm +544 -102
  55. package/src/Pages/Internal/NotFoundReason.elm +3 -2
  56. package/src/Pages/Internal/Platform/Cli.elm +91 -27
  57. package/src/Pages/Internal/Platform/Cli.elm.bak +1276 -0
  58. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  59. package/src/Pages/Internal/Platform.elm +34 -27
  60. package/src/Pages/ProgramConfig.elm +6 -3
  61. package/src/Server/Session.elm +149 -83
  62. package/src/Server/SetCookie.elm +89 -31
@@ -1,8 +1,28 @@
1
- module Pages.Generate exposing (Type(..), serverRender, buildWithLocalState, buildNoState, Builder)
1
+ module Pages.Generate exposing
2
+ ( buildWithLocalState, buildWithSharedState, buildNoState, Builder
3
+ , Type(..)
4
+ , serverRender
5
+ , preRender, single
6
+ )
2
7
 
3
8
  {-|
4
9
 
5
- @docs Type, serverRender, buildWithLocalState, buildNoState, Builder
10
+
11
+ ## Initializing the Generator Builder
12
+
13
+ @docs buildWithLocalState, buildWithSharedState, buildNoState, Builder
14
+
15
+ @docs Type
16
+
17
+
18
+ ## Generating Server-Rendered Pages
19
+
20
+ @docs serverRender
21
+
22
+
23
+ ## Generating pre-rendered pages
24
+
25
+ @docs preRender, single
6
26
 
7
27
  -}
8
28
 
@@ -30,12 +50,18 @@ typeToDeclaration name type_ =
30
50
 
31
51
  {-| -}
32
52
  type Builder
33
- = Builder
53
+ = ServerRender
34
54
  { data : ( Type, Elm.Expression -> Elm.Expression )
35
55
  , action : ( Type, Elm.Expression -> Elm.Expression )
36
56
  , head : Elm.Expression -> Elm.Expression
37
57
  , moduleName : List String
38
58
  }
59
+ | PreRender
60
+ { data : ( Type, Elm.Expression -> Elm.Expression )
61
+ , pages : Maybe Elm.Expression
62
+ , head : Elm.Expression -> Elm.Expression
63
+ , moduleName : List String
64
+ }
39
65
 
40
66
 
41
67
  {-| -}
@@ -47,7 +73,56 @@ serverRender :
47
73
  }
48
74
  -> Builder
49
75
  serverRender =
50
- Builder
76
+ ServerRender
77
+
78
+
79
+ {-| -}
80
+ preRender :
81
+ { data : ( Type, Elm.Expression -> Elm.Expression )
82
+ , pages : Elm.Expression
83
+ , head : Elm.Expression -> Elm.Expression
84
+ , moduleName : List String
85
+ }
86
+ -> Builder
87
+ preRender input =
88
+ --let
89
+ -- hasDynamicRouteSegments : Bool
90
+ -- hasDynamicRouteSegments =
91
+ -- RoutePattern.fromModuleName input.moduleName
92
+ -- -- TODO give error if not parseable here
93
+ -- |> Maybe.map RoutePattern.hasRouteParams
94
+ -- |> Maybe.withDefault False
95
+ --in
96
+ PreRender
97
+ { data = input.data
98
+ , pages =
99
+ input.pages
100
+ |> Elm.withType
101
+ (Elm.Annotation.namedWith [ "DataSource" ]
102
+ "DataSource"
103
+ [ Elm.Annotation.list <| Elm.Annotation.named [] "RouteParams"
104
+ ]
105
+ )
106
+ |> Just
107
+ , head = input.head
108
+ , moduleName = input.moduleName
109
+ }
110
+
111
+
112
+ {-| -}
113
+ single :
114
+ { data : ( Type, Elm.Expression )
115
+ , head : Elm.Expression -> Elm.Expression
116
+ , moduleName : List String
117
+ }
118
+ -> Builder
119
+ single input =
120
+ PreRender
121
+ { data = ( Tuple.first input.data, \_ -> Tuple.second input.data )
122
+ , pages = Nothing
123
+ , head = input.head
124
+ , moduleName = input.moduleName
125
+ }
51
126
 
52
127
 
53
128
  {-| -}
@@ -56,20 +131,42 @@ buildNoState :
56
131
  }
57
132
  -> Builder
58
133
  -> Elm.File
59
- buildNoState definitions (Builder builder) =
60
- userFunction builder.moduleName
61
- { view = \_ -> definitions.view
62
- , localState = Nothing
63
- , data = builder.data |> Tuple.second
64
- , action = builder.action |> Tuple.second
65
- , head = builder.head
66
- , types =
67
- { model = Alias (Elm.Annotation.record [])
68
- , msg = Alias Elm.Annotation.unit
69
- , data = builder.data |> Tuple.first
70
- , actionData = builder.action |> Tuple.first
71
- }
72
- }
134
+ buildNoState definitions builder_ =
135
+ case builder_ of
136
+ ServerRender builder ->
137
+ userFunction builder.moduleName
138
+ { view = \_ -> definitions.view
139
+ , localState = Nothing
140
+ , data = builder.data |> Tuple.second
141
+ , action = builder.action |> Tuple.second |> Action
142
+ , head = builder.head
143
+ , types =
144
+ { model = Alias (Elm.Annotation.record [])
145
+ , msg = Alias Elm.Annotation.unit
146
+ , data = builder.data |> Tuple.first
147
+ , actionData = builder.action |> Tuple.first
148
+ }
149
+ }
150
+
151
+ PreRender builder ->
152
+ userFunction builder.moduleName
153
+ { view = \_ -> definitions.view
154
+ , localState = Nothing
155
+ , data = builder.data |> Tuple.second
156
+ , action = builder.pages |> Pages
157
+ , head = builder.head
158
+ , types =
159
+ { model = Alias (Elm.Annotation.record [])
160
+ , msg = Alias Elm.Annotation.unit
161
+ , data = builder.data |> Tuple.first
162
+ , actionData =
163
+ Elm.Annotation.namedWith [ "DataSource" ]
164
+ "DataSource"
165
+ [ Elm.Annotation.list (Elm.Annotation.named [] "RouteParams")
166
+ ]
167
+ |> Alias
168
+ }
169
+ }
73
170
 
74
171
 
75
172
  {-| -}
@@ -83,25 +180,125 @@ buildWithLocalState :
83
180
  }
84
181
  -> Builder
85
182
  -> Elm.File
86
- buildWithLocalState definitions (Builder builder) =
87
- userFunction builder.moduleName
88
- { view = definitions.view
89
- , localState =
90
- Just
91
- { update = definitions.update
92
- , init = definitions.init
93
- , subscriptions = definitions.subscriptions
183
+ buildWithLocalState definitions builder_ =
184
+ case builder_ of
185
+ ServerRender builder ->
186
+ userFunction builder.moduleName
187
+ { view = definitions.view
188
+ , localState =
189
+ Just
190
+ { update = definitions.update
191
+ , init = definitions.init
192
+ , subscriptions = definitions.subscriptions
193
+ , state = LocalState
194
+ }
195
+ , data = builder.data |> Tuple.second
196
+ , action = builder.action |> Tuple.second |> Action
197
+ , head = builder.head
198
+ , types =
199
+ { model = definitions.model
200
+ , msg = definitions.msg
201
+ , data = builder.data |> Tuple.first
202
+ , actionData = builder.action |> Tuple.first
203
+ }
204
+ }
205
+
206
+ PreRender builder ->
207
+ userFunction builder.moduleName
208
+ { view = definitions.view
209
+ , localState =
210
+ Just
211
+ { update = definitions.update
212
+ , init = definitions.init
213
+ , subscriptions = definitions.subscriptions
214
+ , state = LocalState
215
+ }
216
+ , data = builder.data |> Tuple.second
217
+ , action = builder.pages |> Pages
218
+ , head = builder.head
219
+ , types =
220
+ { model = definitions.model
221
+ , msg = definitions.msg
222
+ , data = builder.data |> Tuple.first
223
+ , actionData =
224
+ Elm.Annotation.namedWith [ "DataSource" ]
225
+ "DataSource"
226
+ [ Elm.Annotation.list (Elm.Annotation.named [] "RouteParams")
227
+ ]
228
+ |> Alias
229
+ }
230
+ }
231
+
232
+
233
+ {-| -}
234
+ buildWithSharedState :
235
+ { view : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
236
+ , update : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
237
+ , init : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
238
+ , subscriptions : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
239
+ , msg : Type
240
+ , model : Type
241
+ }
242
+ -> Builder
243
+ -> Elm.File
244
+ buildWithSharedState definitions builder_ =
245
+ case builder_ of
246
+ ServerRender builder ->
247
+ userFunction builder.moduleName
248
+ { view = definitions.view
249
+ , localState =
250
+ Just
251
+ { update = definitions.update
252
+ , init = definitions.init
253
+ , subscriptions = definitions.subscriptions
254
+ , state = SharedState
255
+ }
256
+ , data = builder.data |> Tuple.second
257
+ , action = builder.action |> Tuple.second |> Action
258
+ , head = builder.head
259
+ , types =
260
+ { model = definitions.model
261
+ , msg = definitions.msg
262
+ , data = builder.data |> Tuple.first
263
+ , actionData = builder.action |> Tuple.first
264
+ }
94
265
  }
95
- , data = builder.data |> Tuple.second
96
- , action = builder.action |> Tuple.second
97
- , head = builder.head
98
- , types =
99
- { model = definitions.model
100
- , msg = definitions.msg
101
- , data = builder.data |> Tuple.first
102
- , actionData = builder.action |> Tuple.first
103
- }
104
- }
266
+
267
+ PreRender builder ->
268
+ userFunction builder.moduleName
269
+ { view = definitions.view
270
+ , localState =
271
+ Just
272
+ { update = definitions.update
273
+ , init = definitions.init
274
+ , subscriptions = definitions.subscriptions
275
+ , state = SharedState
276
+ }
277
+ , data = builder.data |> Tuple.second
278
+ , action = builder.pages |> Pages
279
+ , head = builder.head
280
+ , types =
281
+ { model = definitions.model
282
+ , msg = definitions.msg
283
+ , data = builder.data |> Tuple.first
284
+ , actionData =
285
+ Elm.Annotation.namedWith [ "DataSource" ]
286
+ "DataSource"
287
+ [ Elm.Annotation.list (Elm.Annotation.named [] "RouteParams")
288
+ ]
289
+ |> Alias
290
+ }
291
+ }
292
+
293
+
294
+ type State
295
+ = SharedState
296
+ | LocalState
297
+
298
+
299
+ type ActionOrPages
300
+ = Action (Elm.Expression -> Elm.Expression)
301
+ | Pages (Maybe Elm.Expression)
105
302
 
106
303
 
107
304
  {-| -}
@@ -114,9 +311,10 @@ userFunction :
114
311
  { update : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
115
312
  , init : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
116
313
  , subscriptions : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression
314
+ , state : State
117
315
  }
118
316
  , data : Elm.Expression -> Elm.Expression
119
- , action : Elm.Expression -> Elm.Expression
317
+ , action : ActionOrPages
120
318
  , head : Elm.Expression -> Elm.Expression
121
319
  , types : { model : Type, msg : Type, data : Type, actionData : Type }
122
320
  }
@@ -180,6 +378,7 @@ userFunction moduleName definitions =
180
378
  }
181
379
  , initFn : { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression }
182
380
  , subscriptionsFn : { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression }
381
+ , state : State
183
382
  }
184
383
  localDefinitions =
185
384
  definitions.localState
@@ -222,28 +421,88 @@ userFunction moduleName definitions =
222
421
  ( "sharedModel", Nothing )
223
422
  ( "model", Nothing )
224
423
  localState.subscriptions
424
+ , state = localState.state
225
425
  }
226
426
  )
227
427
 
228
- dataFn : { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression }
428
+ dataFn : { declaration : Elm.Declaration, call : List Elm.Expression -> Elm.Expression, callFrom : List String -> List Elm.Expression -> Elm.Expression }
229
429
  dataFn =
230
- Elm.Declare.fn "data"
231
- ( "routeParams"
232
- , "RouteParams"
233
- |> Elm.Annotation.named []
234
- |> Just
235
- )
236
- (definitions.data >> Elm.withType (myType "Data"))
430
+ case definitions.action of
431
+ Pages Nothing ->
432
+ Elm.Declare.function "data"
433
+ []
434
+ (\_ ->
435
+ definitions.data Elm.unit
436
+ |> Elm.withType
437
+ (case definitions.action of
438
+ Pages _ ->
439
+ Elm.Annotation.namedWith [ "DataSource" ]
440
+ "DataSource"
441
+ [ Elm.Annotation.named [] "Data"
442
+ ]
443
+
444
+ Action _ ->
445
+ myType "Data"
446
+ )
447
+ )
237
448
 
238
- actionFn : { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression }
449
+ _ ->
450
+ Elm.Declare.function "data"
451
+ [ ( "routeParams"
452
+ , "RouteParams"
453
+ |> Elm.Annotation.named []
454
+ |> Just
455
+ )
456
+ ]
457
+ (\args ->
458
+ case args of
459
+ [ arg ] ->
460
+ definitions.data arg
461
+ |> Elm.withType
462
+ (case definitions.action of
463
+ Pages _ ->
464
+ Elm.Annotation.namedWith [ "DataSource" ]
465
+ "DataSource"
466
+ [ Elm.Annotation.named [] "Data"
467
+ ]
468
+
469
+ Action _ ->
470
+ myType "Data"
471
+ )
472
+
473
+ _ ->
474
+ Elm.unit
475
+ )
476
+
477
+ actionFn : Maybe { declaration : Elm.Declaration, call : List Elm.Expression -> Elm.Expression, callFrom : List String -> List Elm.Expression -> Elm.Expression }
239
478
  actionFn =
240
- Elm.Declare.fn "action"
241
- ( "routeParams"
242
- , "RouteParams"
243
- |> Elm.Annotation.named []
244
- |> Just
245
- )
246
- (definitions.action >> Elm.withType (myType "ActionData"))
479
+ case definitions.action of
480
+ Action action_ ->
481
+ Elm.Declare.function "action"
482
+ [ ( "routeParams"
483
+ , "RouteParams"
484
+ |> Elm.Annotation.named []
485
+ |> Just
486
+ )
487
+ ]
488
+ (\args ->
489
+ case args of
490
+ [ arg ] ->
491
+ action_ arg |> Elm.withType (myType "ActionData")
492
+
493
+ _ ->
494
+ Elm.unit
495
+ )
496
+ |> Just
497
+
498
+ Pages pages_ ->
499
+ pages_
500
+ |> Maybe.map
501
+ (\justPagesExpression ->
502
+ Elm.Declare.function "pages"
503
+ []
504
+ (\_ -> justPagesExpression)
505
+ )
247
506
 
248
507
  headFn : { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression }
249
508
  headFn =
@@ -268,49 +527,88 @@ userFunction moduleName definitions =
268
527
  )
269
528
  )
270
529
  , Elm.declaration "route"
271
- (serverRender_
272
- { action =
273
- \routeParams ->
274
- actionFn.call routeParams
275
- |> Elm.withType (myType "ActionData")
276
- , data =
277
- \routeParams ->
278
- dataFn.call routeParams
279
- |> Elm.withType (myType "Data")
280
- , head = headFn.call
281
- }
282
- |> (case localDefinitions of
283
- Just local ->
284
- buildWithLocalState_
285
- { view = viewFn.call
286
- , update = local.updateFn.call
287
- , init = local.initFn.call
288
- , subscriptions = local.subscriptionsFn.call
289
- }
290
- >> Elm.withType
291
- (Elm.Annotation.namedWith [ "RouteBuilder" ]
292
- "StatefulRoute"
293
- [ localType "RouteParams"
294
- , localType "Data"
295
- , localType "ActionData"
296
- , localType "Model"
297
- , localType "Msg"
298
- ]
299
- )
530
+ (case definitions.action of
531
+ Action _ ->
532
+ serverRender_
533
+ { action =
534
+ \routeParams ->
535
+ actionFn
536
+ |> Maybe.map
537
+ (\justActionFn ->
538
+ justActionFn.call [ routeParams ]
539
+ |> Elm.withType (myType "ActionData")
540
+ )
541
+ |> Maybe.withDefault Elm.unit
542
+ , data =
543
+ \routeParams ->
544
+ dataFn.call [ routeParams ]
545
+ |> Elm.withType (myType "Data")
546
+ , head = headFn.call
547
+ }
300
548
 
549
+ Pages _ ->
550
+ (case actionFn of
301
551
  Nothing ->
302
- buildNoState_
303
- { view = viewFn.call Elm.unit
552
+ single_
553
+ { data =
554
+ dataFn.call []
555
+ |> Elm.withType
556
+ (Elm.Annotation.namedWith [ "DataSource" ]
557
+ "DataSource"
558
+ [ Elm.Annotation.named [] "Data"
559
+ ]
560
+ )
561
+ , head = headFn.call
304
562
  }
305
- >> Elm.withType
306
- (Elm.Annotation.namedWith [ "RouteBuilder" ]
307
- "StatelessRoute"
308
- [ localType "RouteParams"
309
- , localType "Data"
310
- , localType "ActionData"
311
- ]
312
- )
313
- )
563
+
564
+ Just justActionFn ->
565
+ preRender_
566
+ { pages = justActionFn.call []
567
+ , data =
568
+ \routeParams ->
569
+ dataFn.call [ routeParams ]
570
+ |> Elm.withType
571
+ (Elm.Annotation.namedWith [ "DataSource" ]
572
+ "DataSource"
573
+ [ Elm.Annotation.named [] "Data"
574
+ ]
575
+ )
576
+ , head = headFn.call
577
+ }
578
+ )
579
+ |> (case localDefinitions of
580
+ Just local ->
581
+ buildWithLocalState_
582
+ { view = viewFn.call
583
+ , update = local.updateFn.call
584
+ , init = local.initFn.call
585
+ , subscriptions = local.subscriptionsFn.call
586
+ , state = local.state
587
+ }
588
+ >> Elm.withType
589
+ (Elm.Annotation.namedWith [ "RouteBuilder" ]
590
+ "StatefulRoute"
591
+ [ localType "RouteParams"
592
+ , localType "Data"
593
+ , localType "ActionData"
594
+ , localType "Model"
595
+ , localType "Msg"
596
+ ]
597
+ )
598
+
599
+ Nothing ->
600
+ buildNoState_
601
+ { view = viewFn.call Elm.unit
602
+ }
603
+ >> Elm.withType
604
+ (Elm.Annotation.namedWith [ "RouteBuilder" ]
605
+ "StatelessRoute"
606
+ [ localType "RouteParams"
607
+ , localType "Data"
608
+ , localType "ActionData"
609
+ ]
610
+ )
611
+ )
314
612
  )
315
613
  ]
316
614
  ++ (case localDefinitions of
@@ -326,10 +624,13 @@ userFunction moduleName definitions =
326
624
  ++ [ definitions.types.data |> typeToDeclaration "Data"
327
625
  , definitions.types.actionData |> typeToDeclaration "ActionData"
328
626
  , dataFn.declaration
329
- , actionFn.declaration
330
627
  , headFn.declaration
331
628
  , viewFn.declaration
332
629
  ]
630
+ ++ ([ actionFn |> Maybe.map .declaration
631
+ ]
632
+ |> List.filterMap identity
633
+ )
333
634
  )
334
635
 
335
636
 
@@ -463,6 +764,128 @@ serverRender_ serverRenderArg =
463
764
  ]
464
765
 
465
766
 
767
+ preRender_ :
768
+ { data : Elm.Expression -> Elm.Expression
769
+ , pages : Elm.Expression
770
+ , head : Elm.Expression -> Elm.Expression
771
+ }
772
+ -> Elm.Expression
773
+ preRender_ serverRenderArg =
774
+ Elm.apply
775
+ (Elm.value
776
+ { importFrom = [ "RouteBuilder" ]
777
+ , name = "preRender"
778
+ , annotation =
779
+ Just
780
+ (Elm.Annotation.function
781
+ [ Elm.Annotation.record
782
+ [ ( "data"
783
+ , Elm.Annotation.function
784
+ [ Elm.Annotation.var "routeParams" ]
785
+ (Elm.Annotation.namedWith
786
+ [ "DataSource" ]
787
+ "DataSource"
788
+ [ Elm.Annotation.var "data"
789
+ ]
790
+ )
791
+ )
792
+ , ( "pages"
793
+ , Elm.Annotation.namedWith
794
+ [ "DataSource" ]
795
+ "DataSource"
796
+ [ Elm.Annotation.list (Elm.Annotation.named [] "RouteParams")
797
+ ]
798
+ )
799
+ , ( "head"
800
+ , Elm.Annotation.function
801
+ [ Elm.Annotation.namedWith
802
+ [ "RouteBuilder" ]
803
+ "StaticPayload"
804
+ [ Elm.Annotation.var "data"
805
+ , Elm.Annotation.var "action"
806
+ , Elm.Annotation.var "routeParams"
807
+ ]
808
+ ]
809
+ (Elm.Annotation.list
810
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
811
+ )
812
+ )
813
+ ]
814
+ ]
815
+ (Elm.Annotation.namedWith
816
+ [ "RouteBuilder" ]
817
+ "Builder"
818
+ [ Elm.Annotation.named [] "RouteParams"
819
+ , Elm.Annotation.named [] "Data"
820
+ , Elm.Annotation.named [] "Action"
821
+ ]
822
+ )
823
+ )
824
+ }
825
+ )
826
+ [ Elm.record
827
+ [ Tuple.pair "data" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.data)
828
+ , Tuple.pair "pages" serverRenderArg.pages
829
+ , Tuple.pair "head" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
830
+ ]
831
+ ]
832
+
833
+
834
+ single_ :
835
+ { data : Elm.Expression
836
+ , head : Elm.Expression -> Elm.Expression
837
+ }
838
+ -> Elm.Expression
839
+ single_ serverRenderArg =
840
+ Elm.apply
841
+ (Elm.value
842
+ { importFrom = [ "RouteBuilder" ]
843
+ , name = "single"
844
+ , annotation =
845
+ Just
846
+ (Elm.Annotation.function
847
+ [ Elm.Annotation.record
848
+ [ ( "data"
849
+ , Elm.Annotation.namedWith
850
+ [ "DataSource" ]
851
+ "DataSource"
852
+ [ Elm.Annotation.var "data"
853
+ ]
854
+ )
855
+ , ( "head"
856
+ , Elm.Annotation.function
857
+ [ Elm.Annotation.namedWith
858
+ [ "RouteBuilder" ]
859
+ "StaticPayload"
860
+ [ Elm.Annotation.var "data"
861
+ , Elm.Annotation.var "action"
862
+ , Elm.Annotation.var "routeParams"
863
+ ]
864
+ ]
865
+ (Elm.Annotation.list
866
+ (Elm.Annotation.namedWith [ "Head" ] "Tag" [])
867
+ )
868
+ )
869
+ ]
870
+ ]
871
+ (Elm.Annotation.namedWith
872
+ [ "RouteBuilder" ]
873
+ "Builder"
874
+ [ Elm.Annotation.named [] "RouteParams"
875
+ , Elm.Annotation.named [] "Data"
876
+ , Elm.Annotation.named [] "Action"
877
+ ]
878
+ )
879
+ )
880
+ }
881
+ )
882
+ [ Elm.record
883
+ [ Tuple.pair "data" serverRenderArg.data
884
+ , Tuple.pair "head" (Elm.functionReduced "serverRenderUnpack" serverRenderArg.head)
885
+ ]
886
+ ]
887
+
888
+
466
889
  buildWithLocalState_ :
467
890
  { view :
468
891
  Elm.Expression
@@ -486,6 +909,7 @@ buildWithLocalState_ :
486
909
  -> Elm.Expression
487
910
  -> Elm.Expression
488
911
  -> Elm.Expression
912
+ , state : State
489
913
  }
490
914
  -> Elm.Expression
491
915
  -> Elm.Expression
@@ -493,7 +917,13 @@ buildWithLocalState_ buildWithLocalStateArg buildWithLocalStateArg0 =
493
917
  Elm.apply
494
918
  (Elm.value
495
919
  { importFrom = [ "RouteBuilder" ]
496
- , name = "buildWithLocalState"
920
+ , name =
921
+ case buildWithLocalStateArg.state of
922
+ LocalState ->
923
+ "buildWithLocalState"
924
+
925
+ SharedState ->
926
+ "buildWithSharedState"
497
927
  , annotation =
498
928
  Just
499
929
  (Elm.Annotation.function
@@ -569,13 +999,25 @@ buildWithLocalState_ buildWithLocalStateArg buildWithLocalStateArg0 =
569
999
  , Elm.Annotation.var "msg"
570
1000
  , Elm.Annotation.var "model"
571
1001
  ]
572
- (Elm.Annotation.tuple
573
- (Elm.Annotation.var "model")
574
- (Elm.Annotation.namedWith
575
- [ "Effect" ]
576
- "Effect"
577
- [ Elm.Annotation.var "msg" ]
578
- )
1002
+ (case buildWithLocalStateArg.state of
1003
+ LocalState ->
1004
+ Elm.Annotation.tuple
1005
+ (Elm.Annotation.var "model")
1006
+ (Elm.Annotation.namedWith
1007
+ [ "Effect" ]
1008
+ "Effect"
1009
+ [ Elm.Annotation.var "msg" ]
1010
+ )
1011
+
1012
+ SharedState ->
1013
+ Elm.Annotation.triple
1014
+ (Elm.Annotation.var "model")
1015
+ (Elm.Annotation.namedWith
1016
+ [ "Effect" ]
1017
+ "Effect"
1018
+ [ Elm.Annotation.var "msg" ]
1019
+ )
1020
+ (Elm.Annotation.maybe (Elm.Annotation.named [ "Shared" ] "Msg"))
579
1021
  )
580
1022
  )
581
1023
  , ( "subscriptions"