elm-pages 3.0.0-beta.1 → 3.0.0-beta.12

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