elm-pages 2.1.11 → 3.0.0-beta.1
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.
- package/codegen/elm-pages-codegen.js +38507 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/{template/public/style.css → dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock} +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +6795 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25651 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +110 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +187 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/package.json +1 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Reporter.elm +26 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Runner.elm +62 -0
- package/generator/dead-code-review/elm.json +35 -0
- package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +181 -0
- package/generator/dead-code-review/src/ReviewConfig.elm +9 -0
- package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +455 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +6795 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +27617 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +110 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +187 -0
- package/generator/review/elm-stuff/tests-0.19.1/js/package.json +1 -0
- package/generator/review/elm-stuff/tests-0.19.1/src/Reporter.elm +26 -0
- package/generator/review/elm-stuff/tests-0.19.1/src/Runner.elm +62 -0
- package/generator/review/elm.json +13 -4
- package/{src → generator/review/src}/Pages/Review/NoContractViolations.elm +148 -148
- package/generator/review/tests/Pages/Review/NoContractViolationsTest.elm +331 -0
- package/generator/src/RouteBuilder.elm +420 -0
- package/generator/src/SharedTemplate.elm +4 -5
- package/generator/src/SiteConfig.elm +3 -9
- package/generator/src/build.js +308 -95
- package/generator/src/cli.js +103 -8
- package/generator/src/codegen.js +192 -35
- package/generator/src/compile-elm.js +183 -31
- package/generator/src/dev-server.js +353 -96
- package/generator/src/elm-application.json +3 -1
- package/generator/src/elm-codegen.js +34 -0
- package/generator/src/elm-file-constants.js +2 -0
- package/generator/src/error-formatter.js +20 -1
- package/generator/src/generate-template-module-connector.js +125 -927
- package/generator/src/hello.ts +5 -0
- package/generator/src/pre-render-html.js +58 -104
- package/generator/src/render-worker.js +27 -13
- package/generator/src/render.js +252 -197
- package/generator/src/request-cache-fs.js +18 -0
- package/generator/src/request-cache.js +128 -56
- package/generator/src/rewrite-client-elm-json.js +49 -0
- package/generator/src/route-codegen-helpers.js +62 -1
- package/generator/static-code/dev-style.css +22 -0
- package/generator/static-code/elm-pages.js +43 -39
- package/generator/static-code/hmr.js +98 -88
- package/generator/template/app/Api.elm +25 -0
- package/generator/template/app/ErrorPage.elm +38 -0
- package/generator/template/app/Route/Index.elm +87 -0
- package/generator/template/{src → app}/Shared.elm +34 -13
- package/generator/template/app/Site.elm +19 -0
- package/generator/template/{src → app}/View.elm +0 -0
- package/generator/template/elm-pages.config.mjs +5 -0
- package/generator/template/elm.json +1 -0
- package/generator/template/{public/index.js → index.ts} +7 -3
- package/generator/template/package.json +4 -4
- package/generator/template/public/favicon.ico +0 -0
- package/generator/template/public/images/icon-png.png +0 -0
- package/generator/template/src/.gitkeep +0 -0
- package/generator/template/style.css +4 -0
- package/package.json +33 -23
- package/src/ApiRoute.elm +176 -43
- package/src/BuildError.elm +10 -1
- package/src/CookieParser.elm +84 -0
- package/src/DataSource/Env.elm +38 -0
- package/src/DataSource/File.elm +27 -16
- package/src/DataSource/Glob.elm +126 -80
- package/src/DataSource/Http.elm +283 -304
- package/src/DataSource/Internal/Glob.elm +5 -21
- package/src/DataSource/Internal/Request.elm +25 -0
- package/src/DataSource/Port.elm +17 -14
- package/src/DataSource.elm +55 -318
- package/src/Form/Field.elm +717 -0
- package/src/Form/FieldStatus.elm +36 -0
- package/src/Form/FieldView.elm +417 -0
- package/src/Form/FormData.elm +22 -0
- package/src/Form/Validation.elm +391 -0
- package/src/Form/Value.elm +118 -0
- package/src/Form.elm +1683 -0
- package/src/FormData.elm +58 -0
- package/src/FormDecoder.elm +102 -0
- package/src/Head/Seo.elm +12 -4
- package/src/Head.elm +12 -2
- package/src/HtmlPrinter.elm +1 -1
- package/src/Internal/ApiRoute.elm +17 -4
- package/src/Internal/Request.elm +7 -0
- package/src/PageServerResponse.elm +68 -0
- package/src/Pages/ContentCache.elm +1 -229
- package/src/Pages/Fetcher.elm +58 -0
- package/src/Pages/FormState.elm +256 -0
- package/src/Pages/Generate.elm +800 -0
- package/src/Pages/Internal/Form.elm +17 -0
- package/src/Pages/Internal/NotFoundReason.elm +3 -55
- package/src/Pages/Internal/Platform/Cli.elm +777 -579
- package/src/Pages/Internal/Platform/Effect.elm +5 -5
- package/src/Pages/Internal/Platform/StaticResponses.elm +178 -394
- package/src/Pages/Internal/Platform/ToJsPayload.elm +24 -23
- package/src/Pages/Internal/Platform.elm +1244 -504
- package/src/Pages/Internal/ResponseSketch.elm +19 -0
- package/src/Pages/Internal/RoutePattern.elm +596 -45
- package/src/Pages/Manifest.elm +26 -0
- package/src/Pages/Msg.elm +79 -0
- package/src/Pages/ProgramConfig.elm +67 -14
- package/src/Pages/SiteConfig.elm +3 -6
- package/src/Pages/StaticHttp/Request.elm +4 -2
- package/src/Pages/StaticHttpRequest.elm +50 -215
- package/src/Pages/Transition.elm +70 -0
- package/src/Path.elm +1 -0
- package/src/Pattern.elm +98 -0
- package/src/RenderRequest.elm +2 -2
- package/src/RequestsAndPending.elm +111 -9
- package/src/Server/Request.elm +1253 -0
- package/src/Server/Response.elm +292 -0
- package/src/Server/Session.elm +316 -0
- package/src/Server/SetCookie.elm +169 -0
- package/src/TerminalText.elm +1 -1
- package/src/Test/Html/Internal/ElmHtml/Markdown.elm +0 -1
- package/src/Test/Html/Internal/ElmHtml/ToString.elm +1 -1
- package/generator/src/Page.elm +0 -359
- package/generator/src/codegen-template-module.js +0 -183
- package/generator/src/elm-pages-js-minified.js +0 -1
- package/generator/template/src/Api.elm +0 -14
- package/generator/template/src/Page/Index.elm +0 -69
- package/generator/template/src/Site.elm +0 -41
- package/src/DataSource/ServerRequest.elm +0 -60
- package/src/Internal/OptimizedDecoder.elm +0 -18
- package/src/KeepOrDiscard.elm +0 -6
- package/src/OptimizedDecoder/Pipeline.elm +0 -335
- package/src/OptimizedDecoder.elm +0 -818
- package/src/Pages/Internal/ApplicationType.elm +0 -6
- package/src/Pages/Secrets.elm +0 -83
- package/src/Secrets.elm +0 -111
- package/src/SecretsDict.elm +0 -45
package/src/Pages/Manifest.elm
CHANGED
|
@@ -3,6 +3,7 @@ module Pages.Manifest exposing
|
|
|
3
3
|
, init
|
|
4
4
|
, withBackgroundColor, withCategories, withDisplayMode, withIarcRatingId, withLang, withOrientation, withShortName, withThemeColor
|
|
5
5
|
, DisplayMode(..), Orientation(..), IconPurpose(..)
|
|
6
|
+
, generator
|
|
6
7
|
, toJson
|
|
7
8
|
)
|
|
8
9
|
|
|
@@ -45,14 +46,22 @@ You pass your `Pages.Manifest.Config` record into the `Pages.application` functi
|
|
|
45
46
|
@docs DisplayMode, Orientation, IconPurpose
|
|
46
47
|
|
|
47
48
|
|
|
49
|
+
## Generating a Manifest.json
|
|
50
|
+
|
|
51
|
+
@docs generator
|
|
52
|
+
|
|
53
|
+
|
|
48
54
|
## Functions for use by the generated code (`Pages.elm`)
|
|
49
55
|
|
|
50
56
|
@docs toJson
|
|
51
57
|
|
|
52
58
|
-}
|
|
53
59
|
|
|
60
|
+
import ApiRoute
|
|
54
61
|
import Color exposing (Color)
|
|
55
62
|
import Color.Convert
|
|
63
|
+
import DataSource exposing (DataSource)
|
|
64
|
+
import Head
|
|
56
65
|
import Json.Encode as Encode
|
|
57
66
|
import LanguageTag exposing (LanguageTag, emptySubtags)
|
|
58
67
|
import LanguageTag.Country as Country
|
|
@@ -313,6 +322,23 @@ nonEmptyList list =
|
|
|
313
322
|
Just list
|
|
314
323
|
|
|
315
324
|
|
|
325
|
+
{-| A generator for Api.elm to include a manifest.json.
|
|
326
|
+
-}
|
|
327
|
+
generator : String -> DataSource Config -> ApiRoute.ApiRoute ApiRoute.Response
|
|
328
|
+
generator canonicalSiteUrl config =
|
|
329
|
+
ApiRoute.succeed
|
|
330
|
+
(config
|
|
331
|
+
|> DataSource.map (toJson canonicalSiteUrl >> Encode.encode 0)
|
|
332
|
+
)
|
|
333
|
+
|> ApiRoute.literal "manifest.json"
|
|
334
|
+
|> ApiRoute.single
|
|
335
|
+
|> ApiRoute.withGlobalHeadTags
|
|
336
|
+
(DataSource.succeed
|
|
337
|
+
[ Head.manifestLink "/manifest.json"
|
|
338
|
+
]
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
|
|
316
342
|
{-| Feel free to use this, but in 99% of cases you won't need it. The generated
|
|
317
343
|
code will run this for you to generate your `manifest.json` file automatically!
|
|
318
344
|
-}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Pages.Msg exposing
|
|
2
|
+
( Msg(..)
|
|
3
|
+
, map, onSubmit, fetcherOnSubmit, submitIfValid
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
{-|
|
|
7
|
+
|
|
8
|
+
@docs Msg
|
|
9
|
+
|
|
10
|
+
@docs map, onSubmit, fetcherOnSubmit, submitIfValid
|
|
11
|
+
|
|
12
|
+
-}
|
|
13
|
+
|
|
14
|
+
import Form.FormData exposing (FormData)
|
|
15
|
+
import FormDecoder
|
|
16
|
+
import Html exposing (Attribute)
|
|
17
|
+
import Html.Attributes as Attr
|
|
18
|
+
import Json.Decode
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
{-| -}
|
|
22
|
+
type Msg userMsg
|
|
23
|
+
= UserMsg userMsg
|
|
24
|
+
| Submit FormData
|
|
25
|
+
| SubmitIfValid String FormData Bool
|
|
26
|
+
| SubmitFetcher String FormData Bool (Maybe userMsg)
|
|
27
|
+
| FormFieldEvent Json.Decode.Value
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
{-| -}
|
|
31
|
+
onSubmit : Attribute (Msg userMsg)
|
|
32
|
+
onSubmit =
|
|
33
|
+
FormDecoder.formDataOnSubmit
|
|
34
|
+
|> Attr.map Submit
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
{-| -}
|
|
38
|
+
submitIfValid : String -> (List ( String, String ) -> Bool) -> Attribute (Msg userMsg)
|
|
39
|
+
submitIfValid formId isValid =
|
|
40
|
+
FormDecoder.formDataOnSubmit
|
|
41
|
+
|> Attr.map (\formData -> SubmitIfValid formId formData (isValid formData.fields))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
{-| -}
|
|
45
|
+
fetcherOnSubmit : Maybe ({ fields : List ( String, String ) } -> userMsg) -> String -> (List ( String, String ) -> Bool) -> Attribute (Msg userMsg)
|
|
46
|
+
fetcherOnSubmit userMsg formId isValid =
|
|
47
|
+
FormDecoder.formDataOnSubmit
|
|
48
|
+
|> Attr.map
|
|
49
|
+
(\formData ->
|
|
50
|
+
SubmitFetcher formId
|
|
51
|
+
formData
|
|
52
|
+
(isValid formData.fields)
|
|
53
|
+
(userMsg
|
|
54
|
+
|> Maybe.map
|
|
55
|
+
(\toUserMsg ->
|
|
56
|
+
toUserMsg { fields = formData.fields }
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
{-| -}
|
|
63
|
+
map : (a -> b) -> Msg a -> Msg b
|
|
64
|
+
map mapFn msg =
|
|
65
|
+
case msg of
|
|
66
|
+
UserMsg userMsg ->
|
|
67
|
+
UserMsg (mapFn userMsg)
|
|
68
|
+
|
|
69
|
+
Submit info ->
|
|
70
|
+
Submit info
|
|
71
|
+
|
|
72
|
+
SubmitIfValid formId info isValid ->
|
|
73
|
+
SubmitIfValid formId info isValid
|
|
74
|
+
|
|
75
|
+
SubmitFetcher formId info isValid toUserMsg ->
|
|
76
|
+
SubmitFetcher formId info isValid (Maybe.map mapFn toUserMsg)
|
|
77
|
+
|
|
78
|
+
FormFieldEvent value ->
|
|
79
|
+
FormFieldEvent value
|
|
@@ -2,26 +2,39 @@ module Pages.ProgramConfig exposing (ProgramConfig)
|
|
|
2
2
|
|
|
3
3
|
import ApiRoute
|
|
4
4
|
import Browser.Navigation
|
|
5
|
-
import
|
|
5
|
+
import Bytes exposing (Bytes)
|
|
6
|
+
import Bytes.Decode
|
|
7
|
+
import Bytes.Encode
|
|
8
|
+
import DataSource exposing (DataSource)
|
|
9
|
+
import Dict exposing (Dict)
|
|
10
|
+
import Form.FormData exposing (FormData)
|
|
6
11
|
import Head
|
|
7
12
|
import Html exposing (Html)
|
|
13
|
+
import Http
|
|
8
14
|
import Json.Decode as Decode
|
|
9
15
|
import Json.Encode
|
|
16
|
+
import PageServerResponse exposing (PageServerResponse)
|
|
17
|
+
import Pages.Fetcher
|
|
10
18
|
import Pages.Flags
|
|
19
|
+
import Pages.FormState
|
|
11
20
|
import Pages.Internal.NotFoundReason exposing (NotFoundReason)
|
|
21
|
+
import Pages.Internal.Platform.ToJsPayload
|
|
22
|
+
import Pages.Internal.ResponseSketch exposing (ResponseSketch)
|
|
12
23
|
import Pages.Internal.RoutePattern exposing (RoutePattern)
|
|
24
|
+
import Pages.Msg
|
|
13
25
|
import Pages.PageUrl exposing (PageUrl)
|
|
14
26
|
import Pages.SiteConfig exposing (SiteConfig)
|
|
27
|
+
import Pages.Transition
|
|
15
28
|
import Path exposing (Path)
|
|
16
29
|
import Url exposing (Url)
|
|
17
30
|
|
|
18
31
|
|
|
19
|
-
type alias ProgramConfig userMsg userModel route
|
|
32
|
+
type alias ProgramConfig userMsg userModel route pageData actionData sharedData effect mappedMsg errorPage =
|
|
20
33
|
{ init :
|
|
21
34
|
Pages.Flags.Flags
|
|
22
35
|
-> sharedData
|
|
23
36
|
-> pageData
|
|
24
|
-
-> Maybe
|
|
37
|
+
-> Maybe actionData
|
|
25
38
|
->
|
|
26
39
|
Maybe
|
|
27
40
|
{ path :
|
|
@@ -32,29 +45,38 @@ type alias ProgramConfig userMsg userModel route siteData pageData sharedData =
|
|
|
32
45
|
, metadata : route
|
|
33
46
|
, pageUrl : Maybe PageUrl
|
|
34
47
|
}
|
|
35
|
-
-> ( userModel,
|
|
36
|
-
, update : sharedData -> pageData -> Maybe Browser.Navigation.Key -> userMsg -> userModel -> ( userModel,
|
|
48
|
+
-> ( userModel, effect )
|
|
49
|
+
, update : Pages.FormState.PageFormState -> Dict String (Pages.Transition.FetcherState actionData) -> Maybe Pages.Transition.Transition -> sharedData -> pageData -> Maybe Browser.Navigation.Key -> userMsg -> userModel -> ( userModel, effect )
|
|
37
50
|
, subscriptions : route -> Path -> userModel -> Sub userMsg
|
|
38
|
-
, sharedData : DataSource
|
|
39
|
-
, data : route -> DataSource
|
|
51
|
+
, sharedData : DataSource sharedData
|
|
52
|
+
, data : route -> DataSource (PageServerResponse pageData errorPage)
|
|
53
|
+
, action : route -> DataSource (PageServerResponse actionData errorPage)
|
|
54
|
+
, onActionData : actionData -> Maybe userMsg
|
|
40
55
|
, view :
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
56
|
+
Pages.FormState.PageFormState
|
|
57
|
+
-> Dict String (Pages.Transition.FetcherState actionData)
|
|
58
|
+
-> Maybe Pages.Transition.Transition
|
|
59
|
+
->
|
|
60
|
+
{ path : Path
|
|
61
|
+
, route : route
|
|
62
|
+
}
|
|
44
63
|
-> Maybe PageUrl
|
|
45
64
|
-> sharedData
|
|
46
65
|
-> pageData
|
|
66
|
+
-> Maybe actionData
|
|
47
67
|
->
|
|
48
|
-
{ view : userModel -> { title : String, body : Html userMsg }
|
|
68
|
+
{ view : userModel -> { title : String, body : Html (Pages.Msg.Msg userMsg) }
|
|
49
69
|
, head : List Head.Tag
|
|
50
70
|
}
|
|
51
|
-
, handleRoute : route -> DataSource
|
|
52
|
-
, getStaticRoutes : DataSource
|
|
71
|
+
, handleRoute : route -> DataSource (Maybe NotFoundReason)
|
|
72
|
+
, getStaticRoutes : DataSource (List route)
|
|
53
73
|
, urlToRoute : Url -> route
|
|
54
74
|
, routeToPath : route -> List String
|
|
55
|
-
, site : Maybe
|
|
75
|
+
, site : Maybe SiteConfig
|
|
56
76
|
, toJsPort : Json.Encode.Value -> Cmd Never
|
|
57
77
|
, fromJsPort : Sub Decode.Value
|
|
78
|
+
, gotBatchSub : Sub Decode.Value
|
|
79
|
+
, hotReloadData : Sub Bytes
|
|
58
80
|
, onPageChange :
|
|
59
81
|
{ protocol : Url.Protocol
|
|
60
82
|
, host : String
|
|
@@ -70,4 +92,35 @@ type alias ProgramConfig userMsg userModel route siteData pageData sharedData =
|
|
|
70
92
|
-> List (ApiRoute.ApiRoute ApiRoute.Response)
|
|
71
93
|
, pathPatterns : List RoutePattern
|
|
72
94
|
, basePath : List String
|
|
95
|
+
, sendPageData : Pages.Internal.Platform.ToJsPayload.NewThingForPort -> Cmd Never
|
|
96
|
+
, byteEncodePageData : pageData -> Bytes.Encode.Encoder
|
|
97
|
+
, byteDecodePageData : route -> Bytes.Decode.Decoder pageData
|
|
98
|
+
, encodeResponse : ResponseSketch pageData actionData sharedData -> Bytes.Encode.Encoder
|
|
99
|
+
, encodeAction : actionData -> Bytes.Encode.Encoder
|
|
100
|
+
, decodeResponse : Bytes.Decode.Decoder (ResponseSketch pageData actionData sharedData)
|
|
101
|
+
, globalHeadTags : Maybe ((Html Never -> String) -> DataSource (List Head.Tag))
|
|
102
|
+
, cmdToEffect : Cmd userMsg -> effect
|
|
103
|
+
, perform :
|
|
104
|
+
{ fetchRouteData :
|
|
105
|
+
{ data : Maybe FormData
|
|
106
|
+
, toMsg : Result Http.Error Url -> userMsg
|
|
107
|
+
}
|
|
108
|
+
-> Cmd mappedMsg
|
|
109
|
+
, submit :
|
|
110
|
+
{ values : FormData
|
|
111
|
+
, toMsg : Result Http.Error Url -> userMsg
|
|
112
|
+
}
|
|
113
|
+
-> Cmd mappedMsg
|
|
114
|
+
, fromPageMsg : userMsg -> mappedMsg
|
|
115
|
+
, runFetcher : Pages.Fetcher.Fetcher userMsg -> Cmd mappedMsg
|
|
116
|
+
, key : Browser.Navigation.Key
|
|
117
|
+
, setField : { formId : String, name : String, value : String } -> Cmd mappedMsg
|
|
118
|
+
}
|
|
119
|
+
-> effect
|
|
120
|
+
-> Cmd mappedMsg
|
|
121
|
+
, errorStatusCode : errorPage -> Int
|
|
122
|
+
, notFoundPage : errorPage
|
|
123
|
+
, internalError : String -> errorPage
|
|
124
|
+
, errorPageToData : errorPage -> pageData
|
|
125
|
+
, notFoundRoute : route
|
|
73
126
|
}
|
package/src/Pages/SiteConfig.elm
CHANGED
|
@@ -2,12 +2,9 @@ module Pages.SiteConfig exposing (SiteConfig)
|
|
|
2
2
|
|
|
3
3
|
import DataSource exposing (DataSource)
|
|
4
4
|
import Head
|
|
5
|
-
import Pages.Manifest
|
|
6
5
|
|
|
7
6
|
|
|
8
|
-
type alias SiteConfig
|
|
9
|
-
{
|
|
10
|
-
,
|
|
11
|
-
, manifest : data -> Pages.Manifest.Config
|
|
12
|
-
, head : data -> List Head.Tag
|
|
7
|
+
type alias SiteConfig =
|
|
8
|
+
{ canonicalUrl : String
|
|
9
|
+
, head : DataSource (List Head.Tag)
|
|
13
10
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Pages.StaticHttp.Request exposing (Request, codec, hash)
|
|
2
2
|
|
|
3
3
|
import Codec exposing (Codec)
|
|
4
|
+
import FNV1a
|
|
4
5
|
import Json.Encode as Encode
|
|
5
|
-
import Murmur3
|
|
6
6
|
import Pages.Internal.StaticHttpBody as StaticHttpBody exposing (Body)
|
|
7
7
|
|
|
8
8
|
|
|
@@ -11,6 +11,7 @@ type alias Request =
|
|
|
11
11
|
, method : String
|
|
12
12
|
, headers : List ( String, String )
|
|
13
13
|
, body : Body
|
|
14
|
+
, useCache : Bool
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
|
|
@@ -23,7 +24,7 @@ hash requestDetails =
|
|
|
23
24
|
, ( "body", StaticHttpBody.encode requestDetails.body )
|
|
24
25
|
]
|
|
25
26
|
|> Encode.encode 0
|
|
26
|
-
|>
|
|
27
|
+
|> FNV1a.hash
|
|
27
28
|
|> String.fromInt
|
|
28
29
|
|
|
29
30
|
|
|
@@ -39,4 +40,5 @@ codec =
|
|
|
39
40
|
|> Codec.field "method" .method Codec.string
|
|
40
41
|
|> Codec.field "headers" .headers (Codec.list (Codec.tuple Codec.string Codec.string))
|
|
41
42
|
|> Codec.field "body" .body StaticHttpBody.codec
|
|
43
|
+
|> Codec.field "useCache" .useCache Codec.bool
|
|
42
44
|
|> Codec.buildObject
|
|
@@ -1,203 +1,26 @@
|
|
|
1
|
-
module Pages.StaticHttpRequest exposing (Error(..), RawRequest(..), Status(..),
|
|
1
|
+
module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve, resolve, resolveUrls, toBuildError)
|
|
2
2
|
|
|
3
3
|
import BuildError exposing (BuildError)
|
|
4
|
-
import Dict
|
|
5
|
-
import Internal.OptimizedDecoder
|
|
6
|
-
import Json.Decode.Exploration
|
|
7
|
-
import Json.Encode
|
|
8
|
-
import KeepOrDiscard exposing (KeepOrDiscard)
|
|
4
|
+
import Dict
|
|
9
5
|
import List.Extra
|
|
10
|
-
import OptimizedDecoder
|
|
11
|
-
import Pages.Internal.ApplicationType exposing (ApplicationType)
|
|
12
6
|
import Pages.StaticHttp.Request
|
|
13
7
|
import RequestsAndPending exposing (RequestsAndPending)
|
|
14
|
-
import Secrets
|
|
15
8
|
import TerminalText as Terminal
|
|
16
9
|
|
|
17
10
|
|
|
11
|
+
type alias MockResolver =
|
|
12
|
+
Pages.StaticHttp.Request.Request
|
|
13
|
+
-> Maybe RequestsAndPending.Response
|
|
14
|
+
|
|
15
|
+
|
|
18
16
|
type RawRequest value
|
|
19
|
-
= Request (
|
|
17
|
+
= Request (List Pages.StaticHttp.Request.Request) (Maybe MockResolver -> RequestsAndPending -> RawRequest value)
|
|
20
18
|
| RequestError Error
|
|
21
|
-
| ApiRoute
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
type WhatToDo
|
|
25
|
-
= UseRawResponse
|
|
26
|
-
| CliOnly
|
|
27
|
-
| StripResponse (OptimizedDecoder.Decoder ())
|
|
28
|
-
| DistilledResponse Json.Encode.Value
|
|
29
|
-
| Error (List BuildError)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
merge : String -> WhatToDo -> WhatToDo -> WhatToDo
|
|
33
|
-
merge key whatToDo1 whatToDo2 =
|
|
34
|
-
case ( whatToDo1, whatToDo2 ) of
|
|
35
|
-
( Error buildErrors1, Error buildErrors2 ) ->
|
|
36
|
-
Error (buildErrors1 ++ buildErrors2)
|
|
37
|
-
|
|
38
|
-
( Error buildErrors1, _ ) ->
|
|
39
|
-
Error buildErrors1
|
|
40
|
-
|
|
41
|
-
( _, Error buildErrors1 ) ->
|
|
42
|
-
Error buildErrors1
|
|
43
|
-
|
|
44
|
-
( StripResponse strip1, StripResponse strip2 ) ->
|
|
45
|
-
StripResponse (OptimizedDecoder.map2 (\_ _ -> ()) strip1 strip2)
|
|
46
|
-
|
|
47
|
-
( StripResponse strip1, _ ) ->
|
|
48
|
-
StripResponse strip1
|
|
49
|
-
|
|
50
|
-
( _, StripResponse strip1 ) ->
|
|
51
|
-
StripResponse strip1
|
|
52
|
-
|
|
53
|
-
( _, CliOnly ) ->
|
|
54
|
-
whatToDo1
|
|
55
|
-
|
|
56
|
-
( CliOnly, _ ) ->
|
|
57
|
-
whatToDo2
|
|
58
|
-
|
|
59
|
-
( DistilledResponse distilled1, DistilledResponse distilled2 ) ->
|
|
60
|
-
if Json.Encode.encode 0 distilled1 == Json.Encode.encode 0 distilled2 then
|
|
61
|
-
DistilledResponse distilled1
|
|
62
|
-
|
|
63
|
-
else
|
|
64
|
-
Error
|
|
65
|
-
[ { title = "Non-Unique Distill Keys"
|
|
66
|
-
, message =
|
|
67
|
-
[ Terminal.text "I encountered DataSource.distill with two matching keys that had differing encoded values.\n\n"
|
|
68
|
-
, Terminal.text "Look for "
|
|
69
|
-
, Terminal.red <| "DataSource.distill"
|
|
70
|
-
, Terminal.text " with the key "
|
|
71
|
-
, Terminal.red <| ("\"" ++ key ++ "\"")
|
|
72
|
-
, Terminal.text "\n\n"
|
|
73
|
-
, Terminal.yellow <| "The first encoded value was:\n"
|
|
74
|
-
, Terminal.text <| Json.Encode.encode 2 distilled1
|
|
75
|
-
, Terminal.text "\n\n-------------------------------\n\n"
|
|
76
|
-
, Terminal.yellow <| "The second encoded value was:\n"
|
|
77
|
-
, Terminal.text <| Json.Encode.encode 2 distilled2
|
|
78
|
-
]
|
|
79
|
-
, path = "" -- TODO wire in path here?
|
|
80
|
-
, fatal = True
|
|
81
|
-
}
|
|
82
|
-
]
|
|
83
|
-
|
|
84
|
-
( DistilledResponse distilled1, _ ) ->
|
|
85
|
-
DistilledResponse distilled1
|
|
86
|
-
|
|
87
|
-
( _, DistilledResponse distilled1 ) ->
|
|
88
|
-
DistilledResponse distilled1
|
|
89
|
-
|
|
90
|
-
( UseRawResponse, UseRawResponse ) ->
|
|
91
|
-
UseRawResponse
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
strippedResponses : ApplicationType -> RawRequest value -> RequestsAndPending -> Dict String WhatToDo
|
|
95
|
-
strippedResponses =
|
|
96
|
-
strippedResponsesHelp Dict.empty
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
strippedResponsesEncode : ApplicationType -> RawRequest value -> RequestsAndPending -> Result (List BuildError) (Dict String String)
|
|
100
|
-
strippedResponsesEncode appType rawRequest requestsAndPending =
|
|
101
|
-
strippedResponses appType rawRequest requestsAndPending
|
|
102
|
-
|> Dict.toList
|
|
103
|
-
|> List.map
|
|
104
|
-
(\( k, whatToDo ) ->
|
|
105
|
-
(case whatToDo of
|
|
106
|
-
UseRawResponse ->
|
|
107
|
-
Dict.get k requestsAndPending
|
|
108
|
-
|> Maybe.withDefault Nothing
|
|
109
|
-
|> Maybe.withDefault ""
|
|
110
|
-
|> Just
|
|
111
|
-
|> Ok
|
|
112
|
-
|
|
113
|
-
StripResponse decoder ->
|
|
114
|
-
Dict.get k requestsAndPending
|
|
115
|
-
|> Maybe.withDefault Nothing
|
|
116
|
-
|> Maybe.withDefault ""
|
|
117
|
-
|> Json.Decode.Exploration.stripString (Internal.OptimizedDecoder.jde decoder)
|
|
118
|
-
|> Result.withDefault "ERROR"
|
|
119
|
-
|> Just
|
|
120
|
-
|> Ok
|
|
121
|
-
|
|
122
|
-
CliOnly ->
|
|
123
|
-
Nothing
|
|
124
|
-
|> Ok
|
|
125
|
-
|
|
126
|
-
DistilledResponse value ->
|
|
127
|
-
value
|
|
128
|
-
|> Json.Encode.encode 0
|
|
129
|
-
|> Just
|
|
130
|
-
|> Ok
|
|
131
|
-
|
|
132
|
-
Error buildError ->
|
|
133
|
-
Err buildError
|
|
134
|
-
)
|
|
135
|
-
|> Result.map (Maybe.map (Tuple.pair k))
|
|
136
|
-
)
|
|
137
|
-
|> combineMultipleErrors
|
|
138
|
-
|> Result.map (List.filterMap identity)
|
|
139
|
-
|> Result.map Dict.fromList
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
combineMultipleErrors : List (Result (List error) a) -> Result (List error) (List a)
|
|
143
|
-
combineMultipleErrors results =
|
|
144
|
-
List.foldr
|
|
145
|
-
(\result soFarResult ->
|
|
146
|
-
case soFarResult of
|
|
147
|
-
Ok soFarOk ->
|
|
148
|
-
case result of
|
|
149
|
-
Ok value ->
|
|
150
|
-
value :: soFarOk |> Ok
|
|
151
|
-
|
|
152
|
-
Err error_ ->
|
|
153
|
-
Err error_
|
|
154
|
-
|
|
155
|
-
Err errorsSoFar ->
|
|
156
|
-
case result of
|
|
157
|
-
Ok _ ->
|
|
158
|
-
Err errorsSoFar
|
|
159
|
-
|
|
160
|
-
Err error_ ->
|
|
161
|
-
Err <| error_ ++ errorsSoFar
|
|
162
|
-
)
|
|
163
|
-
(Ok [])
|
|
164
|
-
results
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
strippedResponsesHelp : Dict String WhatToDo -> ApplicationType -> RawRequest value -> RequestsAndPending -> Dict String WhatToDo
|
|
168
|
-
strippedResponsesHelp usedSoFar appType request rawResponses =
|
|
169
|
-
case request of
|
|
170
|
-
RequestError _ ->
|
|
171
|
-
usedSoFar
|
|
172
|
-
|
|
173
|
-
Request partiallyStrippedResponses ( _, lookupFn ) ->
|
|
174
|
-
case lookupFn KeepOrDiscard.Keep appType rawResponses of
|
|
175
|
-
followupRequest ->
|
|
176
|
-
strippedResponsesHelp
|
|
177
|
-
(Dict.merge
|
|
178
|
-
(\key a -> Dict.insert key a)
|
|
179
|
-
(\key a b -> Dict.insert key (merge key a b))
|
|
180
|
-
(\key b -> Dict.insert key b)
|
|
181
|
-
usedSoFar
|
|
182
|
-
partiallyStrippedResponses
|
|
183
|
-
Dict.empty
|
|
184
|
-
)
|
|
185
|
-
appType
|
|
186
|
-
followupRequest
|
|
187
|
-
rawResponses
|
|
188
|
-
|
|
189
|
-
ApiRoute partiallyStrippedResponses _ ->
|
|
190
|
-
Dict.merge
|
|
191
|
-
(\key a -> Dict.insert key a)
|
|
192
|
-
(\key a b -> Dict.insert key (merge key a b))
|
|
193
|
-
(\key b -> Dict.insert key b)
|
|
194
|
-
usedSoFar
|
|
195
|
-
partiallyStrippedResponses
|
|
196
|
-
Dict.empty
|
|
19
|
+
| ApiRoute value
|
|
197
20
|
|
|
198
21
|
|
|
199
22
|
type Error
|
|
200
|
-
= MissingHttpResponse String (List
|
|
23
|
+
= MissingHttpResponse String (List Pages.StaticHttp.Request.Request)
|
|
201
24
|
| DecoderError String
|
|
202
25
|
| UserCalledStaticHttpFail String
|
|
203
26
|
|
|
@@ -233,70 +56,83 @@ toBuildError path error =
|
|
|
233
56
|
}
|
|
234
57
|
|
|
235
58
|
|
|
236
|
-
resolve :
|
|
237
|
-
resolve
|
|
59
|
+
resolve : RawRequest value -> RequestsAndPending -> Result Error value
|
|
60
|
+
resolve request rawResponses =
|
|
238
61
|
case request of
|
|
239
62
|
RequestError error ->
|
|
240
63
|
Err error
|
|
241
64
|
|
|
242
|
-
Request _
|
|
243
|
-
case lookupFn
|
|
65
|
+
Request _ lookupFn ->
|
|
66
|
+
case lookupFn Nothing rawResponses of
|
|
244
67
|
nextRequest ->
|
|
245
|
-
resolve
|
|
68
|
+
resolve nextRequest rawResponses
|
|
246
69
|
|
|
247
|
-
ApiRoute
|
|
70
|
+
ApiRoute value ->
|
|
248
71
|
Ok value
|
|
249
72
|
|
|
250
73
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
74
|
+
mockResolve : RawRequest value -> MockResolver -> Result Error value
|
|
75
|
+
mockResolve request mockResolver =
|
|
76
|
+
case request of
|
|
77
|
+
RequestError error ->
|
|
78
|
+
Err error
|
|
254
79
|
|
|
80
|
+
Request _ lookupFn ->
|
|
81
|
+
case lookupFn (Just mockResolver) Dict.empty of
|
|
82
|
+
nextRequest ->
|
|
83
|
+
mockResolve nextRequest mockResolver
|
|
255
84
|
|
|
256
|
-
|
|
257
|
-
|
|
85
|
+
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 =
|
|
258
96
|
case request of
|
|
259
97
|
RequestError error ->
|
|
260
98
|
case error of
|
|
261
99
|
MissingHttpResponse _ next ->
|
|
262
100
|
(soFar ++ next)
|
|
263
|
-
|> List.Extra.uniqueBy
|
|
101
|
+
|> List.Extra.uniqueBy Pages.StaticHttp.Request.hash
|
|
264
102
|
|
|
265
103
|
_ ->
|
|
266
104
|
soFar
|
|
267
105
|
|
|
268
|
-
Request
|
|
269
|
-
resolveUrlsHelp
|
|
106
|
+
Request urlList lookupFn ->
|
|
107
|
+
resolveUrlsHelp
|
|
270
108
|
rawResponses
|
|
271
109
|
(soFar ++ urlList)
|
|
272
|
-
(lookupFn
|
|
110
|
+
(lookupFn Nothing rawResponses)
|
|
273
111
|
|
|
274
|
-
ApiRoute _
|
|
112
|
+
ApiRoute _ ->
|
|
275
113
|
soFar
|
|
276
114
|
|
|
277
115
|
|
|
278
116
|
cacheRequestResolution :
|
|
279
|
-
|
|
280
|
-
-> RawRequest value
|
|
117
|
+
RawRequest value
|
|
281
118
|
-> RequestsAndPending
|
|
282
119
|
-> Status value
|
|
283
|
-
cacheRequestResolution
|
|
284
|
-
cacheRequestResolutionHelp []
|
|
120
|
+
cacheRequestResolution request rawResponses =
|
|
121
|
+
cacheRequestResolutionHelp [] rawResponses request
|
|
285
122
|
|
|
286
123
|
|
|
287
124
|
type Status value
|
|
288
|
-
= Incomplete (List
|
|
125
|
+
= Incomplete (List Pages.StaticHttp.Request.Request)
|
|
289
126
|
| HasPermanentError Error
|
|
290
127
|
| Complete
|
|
291
128
|
|
|
292
129
|
|
|
293
130
|
cacheRequestResolutionHelp :
|
|
294
|
-
List
|
|
295
|
-
-> ApplicationType
|
|
131
|
+
List Pages.StaticHttp.Request.Request
|
|
296
132
|
-> RequestsAndPending
|
|
297
133
|
-> RawRequest value
|
|
298
134
|
-> Status value
|
|
299
|
-
cacheRequestResolutionHelp foundUrls
|
|
135
|
+
cacheRequestResolutionHelp foundUrls rawResponses request =
|
|
300
136
|
case request of
|
|
301
137
|
RequestError error ->
|
|
302
138
|
case error of
|
|
@@ -310,11 +146,10 @@ cacheRequestResolutionHelp foundUrls appType rawResponses request =
|
|
|
310
146
|
UserCalledStaticHttpFail _ ->
|
|
311
147
|
HasPermanentError error
|
|
312
148
|
|
|
313
|
-
Request
|
|
149
|
+
Request urlList lookupFn ->
|
|
314
150
|
cacheRequestResolutionHelp urlList
|
|
315
|
-
appType
|
|
316
151
|
rawResponses
|
|
317
|
-
(lookupFn
|
|
152
|
+
(lookupFn Nothing rawResponses)
|
|
318
153
|
|
|
319
|
-
ApiRoute _
|
|
154
|
+
ApiRoute _ ->
|
|
320
155
|
Complete
|