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
@@ -1,6 +1,9 @@
1
1
  module Pages.Internal.StaticHttpBody exposing (Body(..), codec, encode)
2
2
 
3
+ import Base64
4
+ import Bytes exposing (Bytes)
3
5
  import Codec exposing (Codec)
6
+ import Json.Decode
4
7
  import Json.Encode as Encode
5
8
 
6
9
 
@@ -8,6 +11,7 @@ type Body
8
11
  = EmptyBody
9
12
  | StringBody String String
10
13
  | JsonBody Encode.Value
14
+ | BytesBody String Bytes
11
15
 
12
16
 
13
17
  encode : Body -> Encode.Value
@@ -26,6 +30,15 @@ encode body =
26
30
  [ ( "content", content )
27
31
  ]
28
32
 
33
+ BytesBody _ content ->
34
+ encodeWithType "bytes"
35
+ [ ( "content"
36
+ , Base64.fromBytes content
37
+ |> Maybe.withDefault ""
38
+ |> Encode.string
39
+ )
40
+ ]
41
+
29
42
 
30
43
  encodeWithType : String -> List ( String, Encode.Value ) -> Encode.Value
31
44
  encodeWithType typeName otherFields =
@@ -37,7 +50,7 @@ encodeWithType typeName otherFields =
37
50
  codec : Codec Body
38
51
  codec =
39
52
  Codec.custom
40
- (\vEmpty vString vJson value ->
53
+ (\vEmpty vString vJson vBytes value ->
41
54
  case value of
42
55
  EmptyBody ->
43
56
  vEmpty
@@ -47,8 +60,29 @@ codec =
47
60
 
48
61
  JsonBody body ->
49
62
  vJson body
63
+
64
+ BytesBody contentType body ->
65
+ vBytes contentType body
50
66
  )
51
67
  |> Codec.variant0 "EmptyBody" EmptyBody
52
68
  |> Codec.variant2 "StringBody" StringBody Codec.string Codec.string
53
69
  |> Codec.variant1 "JsonBody" JsonBody Codec.value
70
+ |> Codec.variant2 "BytesBody" BytesBody Codec.string bytesCodec
54
71
  |> Codec.buildCustom
72
+
73
+
74
+ bytesCodec : Codec Bytes
75
+ bytesCodec =
76
+ Codec.build (Base64.fromBytes >> Maybe.withDefault "" >> Encode.string)
77
+ (Json.Decode.string
78
+ |> Json.Decode.map Base64.toBytes
79
+ |> Json.Decode.andThen
80
+ (\decodedBytes ->
81
+ case decodedBytes of
82
+ Just bytes ->
83
+ Json.Decode.succeed bytes
84
+
85
+ Nothing ->
86
+ Json.Decode.fail "Couldn't parse bytes."
87
+ )
88
+ )
@@ -2,6 +2,7 @@ module Pages.Manifest exposing
2
2
  ( Config, Icon
3
3
  , init
4
4
  , withBackgroundColor, withCategories, withDisplayMode, withIarcRatingId, withLang, withOrientation, withShortName, withThemeColor
5
+ , withField
5
6
  , DisplayMode(..), Orientation(..), IconPurpose(..)
6
7
  , generator
7
8
  , toJson
@@ -41,6 +42,11 @@ You pass your `Pages.Manifest.Config` record into the `Pages.application` functi
41
42
  @docs withBackgroundColor, withCategories, withDisplayMode, withIarcRatingId, withLang, withOrientation, withShortName, withThemeColor
42
43
 
43
44
 
45
+ ## Arbitrary Fields Escape Hatch
46
+
47
+ @docs withField
48
+
49
+
44
50
  ## Config options
45
51
 
46
52
  @docs DisplayMode, Orientation, IconPurpose
@@ -58,9 +64,11 @@ You pass your `Pages.Manifest.Config` record into the `Pages.application` functi
58
64
  -}
59
65
 
60
66
  import ApiRoute
67
+ import BackendTask exposing (BackendTask)
61
68
  import Color exposing (Color)
62
69
  import Color.Convert
63
- import DataSource exposing (DataSource)
70
+ import Dict exposing (Dict)
71
+ import FatalError exposing (FatalError)
64
72
  import Head
65
73
  import Json.Encode as Encode
66
74
  import LanguageTag exposing (LanguageTag, emptySubtags)
@@ -123,6 +131,7 @@ init options =
123
131
  , shortName = Nothing
124
132
  , icons = options.icons
125
133
  , lang = usEnglish
134
+ , otherFields = Dict.empty
126
135
  }
127
136
 
128
137
 
@@ -191,6 +200,17 @@ withLang languageTag config =
191
200
  { config | lang = languageTag }
192
201
 
193
202
 
203
+ {-| Escape hatch for specifying fields that aren't exposed through this module otherwise. The possible supported properties
204
+ in a manifest file can change over time, so see [MDN manifest.json docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json)
205
+ for a full listing of the current supported properties.
206
+ -}
207
+ withField : String -> Encode.Value -> Config -> Config
208
+ withField name value config =
209
+ { config
210
+ | otherFields = config.otherFields |> Dict.insert name value
211
+ }
212
+
213
+
194
214
  orientationToString : Orientation -> String
195
215
  orientationToString orientation =
196
216
  case orientation of
@@ -239,6 +259,7 @@ type alias Config =
239
259
  , shortName : Maybe String
240
260
  , icons : List Icon
241
261
  , lang : LanguageTag
262
+ , otherFields : Dict String Encode.Value
242
263
  }
243
264
 
244
265
 
@@ -324,16 +345,16 @@ nonEmptyList list =
324
345
 
325
346
  {-| A generator for Api.elm to include a manifest.json.
326
347
  -}
327
- generator : String -> DataSource Config -> ApiRoute.ApiRoute ApiRoute.Response
348
+ generator : String -> BackendTask FatalError Config -> ApiRoute.ApiRoute ApiRoute.Response
328
349
  generator canonicalSiteUrl config =
329
350
  ApiRoute.succeed
330
351
  (config
331
- |> DataSource.map (toJson canonicalSiteUrl >> Encode.encode 0)
352
+ |> BackendTask.map (toJson canonicalSiteUrl >> Encode.encode 0)
332
353
  )
333
354
  |> ApiRoute.literal "manifest.json"
334
355
  |> ApiRoute.single
335
356
  |> ApiRoute.withGlobalHeadTags
336
- (DataSource.succeed
357
+ (BackendTask.succeed
337
358
  [ Head.manifestLink "/manifest.json"
338
359
  ]
339
360
  )
@@ -420,6 +441,10 @@ toJson canonicalSiteUrl config =
420
441
  , Encode.string "/" |> Just
421
442
  )
422
443
  ]
444
+ ++ (config.otherFields
445
+ |> Dict.toList
446
+ |> List.map (Tuple.mapSecond Just)
447
+ )
423
448
  |> encodeMaybeObject
424
449
 
425
450
 
@@ -1,17 +1,20 @@
1
- module Pages.PageUrl exposing (PageUrl, toUrl)
1
+ module Pages.PageUrl exposing
2
+ ( PageUrl, toUrl
3
+ , parseQueryParams
4
+ )
2
5
 
3
- {-| Same as a Url in `elm/url`, but slightly more structured. The path portion of the URL is parsed into a [`Path`](Path) type, and
4
- the query params use the [`QueryParams`](QueryParams) type which allows you to parse just the query params or access them into a Dict.
5
-
6
- Because `elm-pages` takes care of the main routing for pages in your app, the standard Elm URL parser API isn't suited
7
- to parsing query params individually, which is why the structure of these types is different.
6
+ {-| Same as a Url in `elm/url`, but slightly more structured. The path portion of the URL is parsed into a `List String` representing each segment, and
7
+ the query params are parsed into a `Dict String (List String)`.
8
8
 
9
9
  @docs PageUrl, toUrl
10
10
 
11
+ @docs parseQueryParams
12
+
11
13
  -}
12
14
 
15
+ import Dict exposing (Dict)
13
16
  import Path exposing (Path)
14
- import QueryParams exposing (QueryParams)
17
+ import QueryParams
15
18
  import Url
16
19
 
17
20
 
@@ -21,7 +24,7 @@ type alias PageUrl =
21
24
  , host : String
22
25
  , port_ : Maybe Int
23
26
  , path : Path
24
- , query : Maybe QueryParams
27
+ , query : Dict String (List String)
25
28
  , fragment : Maybe String
26
29
  }
27
30
 
@@ -33,6 +36,17 @@ toUrl url =
33
36
  , host = url.host
34
37
  , port_ = url.port_
35
38
  , path = url.path |> Path.toRelative
36
- , query = url.query |> Maybe.map QueryParams.toString
39
+ , query =
40
+ if url.query |> Dict.isEmpty then
41
+ Nothing
42
+
43
+ else
44
+ url.query |> QueryParams.toString |> Just
37
45
  , fragment = url.fragment
38
46
  }
47
+
48
+
49
+ {-| -}
50
+ parseQueryParams : String -> Dict String (List String)
51
+ parseQueryParams =
52
+ QueryParams.fromString
@@ -1,12 +1,13 @@
1
1
  module Pages.ProgramConfig exposing (ProgramConfig)
2
2
 
3
3
  import ApiRoute
4
+ import BackendTask exposing (BackendTask)
4
5
  import Browser.Navigation
5
6
  import Bytes exposing (Bytes)
6
7
  import Bytes.Decode
7
8
  import Bytes.Encode
8
- import DataSource exposing (DataSource)
9
9
  import Dict exposing (Dict)
10
+ import FatalError exposing (FatalError)
10
11
  import Form.FormData exposing (FormData)
11
12
  import Head
12
13
  import Html exposing (Html)
@@ -21,10 +22,10 @@ import Pages.Internal.NotFoundReason exposing (NotFoundReason)
21
22
  import Pages.Internal.Platform.ToJsPayload
22
23
  import Pages.Internal.ResponseSketch exposing (ResponseSketch)
23
24
  import Pages.Internal.RoutePattern exposing (RoutePattern)
24
- import Pages.Msg
25
25
  import Pages.PageUrl exposing (PageUrl)
26
26
  import Pages.SiteConfig exposing (SiteConfig)
27
27
  import Pages.Transition
28
+ import PagesMsg exposing (PagesMsg)
28
29
  import Path exposing (Path)
29
30
  import Url exposing (Url)
30
31
 
@@ -48,9 +49,9 @@ type alias ProgramConfig userMsg userModel route pageData actionData sharedData
48
49
  -> ( userModel, effect )
49
50
  , update : Pages.FormState.PageFormState -> Dict String (Pages.Transition.FetcherState actionData) -> Maybe Pages.Transition.Transition -> sharedData -> pageData -> Maybe Browser.Navigation.Key -> userMsg -> userModel -> ( userModel, effect )
50
51
  , subscriptions : route -> Path -> userModel -> Sub userMsg
51
- , sharedData : DataSource sharedData
52
- , data : route -> DataSource (PageServerResponse pageData errorPage)
53
- , action : route -> DataSource (PageServerResponse actionData errorPage)
52
+ , sharedData : BackendTask FatalError sharedData
53
+ , data : Decode.Value -> route -> BackendTask FatalError (PageServerResponse pageData errorPage)
54
+ , action : Decode.Value -> route -> BackendTask FatalError (PageServerResponse actionData errorPage)
54
55
  , onActionData : actionData -> Maybe userMsg
55
56
  , view :
56
57
  Pages.FormState.PageFormState
@@ -65,11 +66,11 @@ type alias ProgramConfig userMsg userModel route pageData actionData sharedData
65
66
  -> pageData
66
67
  -> Maybe actionData
67
68
  ->
68
- { view : userModel -> { title : String, body : List (Html (Pages.Msg.Msg userMsg)) }
69
+ { view : userModel -> { title : String, body : List (Html (PagesMsg userMsg)) }
69
70
  , head : List Head.Tag
70
71
  }
71
- , handleRoute : route -> DataSource (Maybe NotFoundReason)
72
- , getStaticRoutes : DataSource (List route)
72
+ , handleRoute : route -> BackendTask FatalError (Maybe NotFoundReason)
73
+ , getStaticRoutes : BackendTask FatalError (List route)
73
74
  , urlToRoute : Url -> route
74
75
  , routeToPath : route -> List String
75
76
  , site : Maybe SiteConfig
@@ -88,7 +89,10 @@ type alias ProgramConfig userMsg userModel route pageData actionData sharedData
88
89
  }
89
90
  -> userMsg
90
91
  , apiRoutes :
91
- (Html Never -> String)
92
+ (Maybe { indent : Int, newLines : Bool }
93
+ -> Html Never
94
+ -> String
95
+ )
92
96
  -> List (ApiRoute.ApiRoute ApiRoute.Response)
93
97
  , pathPatterns : List RoutePattern
94
98
  , basePath : List String
@@ -98,7 +102,7 @@ type alias ProgramConfig userMsg userModel route pageData actionData sharedData
98
102
  , encodeResponse : ResponseSketch pageData actionData sharedData -> Bytes.Encode.Encoder
99
103
  , encodeAction : actionData -> Bytes.Encode.Encoder
100
104
  , decodeResponse : Bytes.Decode.Decoder (ResponseSketch pageData actionData sharedData)
101
- , globalHeadTags : Maybe ((Html Never -> String) -> DataSource (List Head.Tag))
105
+ , globalHeadTags : Maybe ((Maybe { indent : Int, newLines : Bool } -> Html Never -> String) -> BackendTask FatalError (List Head.Tag))
102
106
  , cmdToEffect : Cmd userMsg -> effect
103
107
  , perform :
104
108
  { fetchRouteData :
@@ -0,0 +1,109 @@
1
+ module Pages.Script exposing
2
+ ( Script
3
+ , withCliOptions, withoutCliOptions
4
+ , writeFile
5
+ , log
6
+ , Error(..)
7
+ )
8
+
9
+ {-|
10
+
11
+ @docs Script
12
+
13
+ @docs withCliOptions, withoutCliOptions
14
+
15
+
16
+ ## File System Utilities
17
+
18
+ @docs writeFile
19
+
20
+
21
+ ## Utilities
22
+
23
+ @docs log
24
+
25
+
26
+ ## Errors
27
+
28
+ @docs Error
29
+
30
+ -}
31
+
32
+ import BackendTask exposing (BackendTask)
33
+ import BackendTask.Http
34
+ import BackendTask.Internal.Request
35
+ import Cli.OptionsParser as OptionsParser
36
+ import Cli.Program as Program
37
+ import FatalError exposing (FatalError)
38
+ import Json.Decode as Decode
39
+ import Json.Encode as Encode
40
+ import Pages.Internal.Script
41
+
42
+
43
+ {-| -}
44
+ type alias Script =
45
+ Pages.Internal.Script.Script
46
+
47
+
48
+ {-| -}
49
+ type Error
50
+ = --TODO make more descriptive
51
+ FileWriteError
52
+
53
+
54
+ {-| -}
55
+ writeFile : { path : String, body : String } -> BackendTask { fatal : FatalError, recoverable : Error } ()
56
+ writeFile { path, body } =
57
+ BackendTask.Internal.Request.request
58
+ { name = "write-file"
59
+ , body =
60
+ BackendTask.Http.jsonBody
61
+ (Encode.object
62
+ [ ( "path", Encode.string path )
63
+ , ( "body", Encode.string body )
64
+ ]
65
+ )
66
+ , expect =
67
+ -- TODO decode possible error details here
68
+ BackendTask.Http.expectJson (Decode.succeed ())
69
+ }
70
+
71
+
72
+ {-| -}
73
+ log : String -> BackendTask error ()
74
+ log message =
75
+ BackendTask.Internal.Request.request
76
+ { name = "log"
77
+ , body =
78
+ BackendTask.Http.jsonBody
79
+ (Encode.object
80
+ [ ( "message", Encode.string message )
81
+ ]
82
+ )
83
+ , expect = BackendTask.Http.expectJson (Decode.succeed ())
84
+ }
85
+
86
+
87
+ {-| -}
88
+ withoutCliOptions : BackendTask FatalError () -> Script
89
+ withoutCliOptions execute =
90
+ Pages.Internal.Script.Script
91
+ (\_ ->
92
+ Program.config
93
+ |> Program.add
94
+ (OptionsParser.build ())
95
+ |> Program.mapConfig
96
+ (\() ->
97
+ execute
98
+ )
99
+ )
100
+
101
+
102
+ {-| -}
103
+ withCliOptions : Program.Config cliOptions -> (cliOptions -> BackendTask FatalError ()) -> Script
104
+ withCliOptions config execute =
105
+ Pages.Internal.Script.Script
106
+ (\_ ->
107
+ config
108
+ |> Program.mapConfig execute
109
+ )
@@ -1,10 +1,11 @@
1
1
  module Pages.SiteConfig exposing (SiteConfig)
2
2
 
3
- import DataSource exposing (DataSource)
3
+ import BackendTask exposing (BackendTask)
4
+ import FatalError exposing (FatalError)
4
5
  import Head
5
6
 
6
7
 
7
8
  type alias SiteConfig =
8
9
  { canonicalUrl : String
9
- , head : DataSource (List Head.Tag)
10
+ , head : BackendTask FatalError (List Head.Tag)
10
11
  }
@@ -11,7 +11,7 @@ type alias Request =
11
11
  , method : String
12
12
  , headers : List ( String, String )
13
13
  , body : Body
14
- , useCache : Bool
14
+ , cacheOptions : Maybe Encode.Value
15
15
  }
16
16
 
17
17
 
@@ -40,5 +40,5 @@ codec =
40
40
  |> Codec.field "method" .method Codec.string
41
41
  |> Codec.field "headers" .headers (Codec.list (Codec.tuple Codec.string Codec.string))
42
42
  |> Codec.field "body" .body StaticHttpBody.codec
43
- |> Codec.field "useCache" .useCache Codec.bool
43
+ |> Codec.nullableField "cacheOptions" .cacheOptions Codec.value
44
44
  |> Codec.buildObject
@@ -1,8 +1,8 @@
1
- module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve, resolve, resolveUrls, toBuildError)
1
+ module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve, toBuildError)
2
2
 
3
3
  import BuildError exposing (BuildError)
4
4
  import Dict
5
- import List.Extra
5
+ import Json.Encode
6
6
  import Pages.StaticHttp.Request
7
7
  import RequestsAndPending exposing (RequestsAndPending)
8
8
  import TerminalText as Terminal
@@ -13,30 +13,19 @@ type alias MockResolver =
13
13
  -> Maybe RequestsAndPending.Response
14
14
 
15
15
 
16
- type RawRequest value
17
- = Request (List Pages.StaticHttp.Request.Request) (Maybe MockResolver -> RequestsAndPending -> RawRequest value)
18
- | RequestError Error
19
- | ApiRoute value
16
+ type RawRequest error value
17
+ = Request (List Pages.StaticHttp.Request.Request) (Maybe MockResolver -> RequestsAndPending -> RawRequest error value)
18
+ | ApiRoute (Result error value)
20
19
 
21
20
 
22
21
  type Error
23
- = MissingHttpResponse String (List Pages.StaticHttp.Request.Request)
24
- | DecoderError String
22
+ = DecoderError String
25
23
  | UserCalledStaticHttpFail String
26
24
 
27
25
 
28
26
  toBuildError : String -> Error -> BuildError
29
27
  toBuildError path error =
30
28
  case error of
31
- MissingHttpResponse missingKey _ ->
32
- { title = "Missing Http Response"
33
- , message =
34
- [ Terminal.text missingKey
35
- ]
36
- , path = path
37
- , fatal = True
38
- }
39
-
40
29
  DecoderError decodeErrorMessage ->
41
30
  { title = "Static Http Decoding Error"
42
31
  , message =
@@ -49,107 +38,43 @@ toBuildError path error =
49
38
  UserCalledStaticHttpFail decodeErrorMessage ->
50
39
  { title = "Called Static Http Fail"
51
40
  , message =
52
- [ Terminal.text <| "I ran into a call to `DataSource.fail` with message: " ++ decodeErrorMessage
41
+ [ Terminal.text <| "I ran into a call to `BackendTask.fail` with message: " ++ decodeErrorMessage
53
42
  ]
54
43
  , path = path
55
44
  , fatal = True
56
45
  }
57
46
 
58
47
 
59
- resolve : RawRequest value -> RequestsAndPending -> Result Error value
60
- resolve request rawResponses =
61
- case request of
62
- RequestError error ->
63
- Err error
64
-
65
- Request _ lookupFn ->
66
- case lookupFn Nothing rawResponses of
67
- nextRequest ->
68
- resolve nextRequest rawResponses
69
-
70
- ApiRoute value ->
71
- Ok value
72
-
73
-
74
- mockResolve : RawRequest value -> MockResolver -> Result Error value
48
+ mockResolve : RawRequest error value -> MockResolver -> Result error value
75
49
  mockResolve request mockResolver =
76
50
  case request of
77
- RequestError error ->
78
- Err error
79
-
80
51
  Request _ lookupFn ->
81
- case lookupFn (Just mockResolver) Dict.empty of
52
+ case lookupFn (Just mockResolver) (Json.Encode.object []) of
82
53
  nextRequest ->
83
54
  mockResolve nextRequest mockResolver
84
55
 
85
56
  ApiRoute value ->
86
- Ok value
87
-
88
-
89
- resolveUrls : RawRequest value -> RequestsAndPending -> List Pages.StaticHttp.Request.Request
90
- resolveUrls request rawResponses =
91
- resolveUrlsHelp rawResponses [] request
92
-
93
-
94
- resolveUrlsHelp : RequestsAndPending -> List Pages.StaticHttp.Request.Request -> RawRequest value -> List Pages.StaticHttp.Request.Request
95
- resolveUrlsHelp rawResponses soFar request =
96
- case request of
97
- RequestError error ->
98
- case error of
99
- MissingHttpResponse _ next ->
100
- (soFar ++ next)
101
- |> List.Extra.uniqueBy Pages.StaticHttp.Request.hash
102
-
103
- _ ->
104
- soFar
105
-
106
- Request urlList lookupFn ->
107
- resolveUrlsHelp
108
- rawResponses
109
- (soFar ++ urlList)
110
- (lookupFn Nothing rawResponses)
111
-
112
- ApiRoute _ ->
113
- soFar
57
+ value
114
58
 
115
59
 
116
60
  cacheRequestResolution :
117
- RawRequest value
61
+ RawRequest error value
118
62
  -> RequestsAndPending
119
- -> Status value
63
+ -> Status error value
120
64
  cacheRequestResolution request rawResponses =
121
- cacheRequestResolutionHelp [] rawResponses request
122
-
123
-
124
- type Status value
125
- = Incomplete (List Pages.StaticHttp.Request.Request)
126
- | HasPermanentError Error
127
- | Complete
128
-
129
-
130
- cacheRequestResolutionHelp :
131
- List Pages.StaticHttp.Request.Request
132
- -> RequestsAndPending
133
- -> RawRequest value
134
- -> Status value
135
- cacheRequestResolutionHelp foundUrls rawResponses request =
136
65
  case request of
137
- RequestError error ->
138
- case error of
139
- MissingHttpResponse _ _ ->
140
- -- TODO do I need to pass through continuation URLs here? -- Incomplete (urlList ++ foundUrls)
141
- Incomplete foundUrls
66
+ Request urlList lookupFn ->
67
+ if List.isEmpty urlList then
68
+ cacheRequestResolution (lookupFn Nothing rawResponses) rawResponses
142
69
 
143
- DecoderError _ ->
144
- HasPermanentError error
70
+ else
71
+ Incomplete urlList (Request [] lookupFn)
145
72
 
146
- UserCalledStaticHttpFail _ ->
147
- HasPermanentError error
73
+ ApiRoute value ->
74
+ Complete value
148
75
 
149
- Request urlList lookupFn ->
150
- cacheRequestResolutionHelp urlList
151
- rawResponses
152
- (lookupFn Nothing rawResponses)
153
76
 
154
- ApiRoute _ ->
155
- Complete
77
+ type Status error value
78
+ = Incomplete (List Pages.StaticHttp.Request.Request) (RawRequest error value)
79
+ | HasPermanentError Error
80
+ | Complete (Result error value)