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

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