elm-pages 3.0.0-beta.8 → 3.0.0
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/README.md +11 -2
- package/adapter/netlify.js +207 -0
- package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2730 -2938
- 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.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/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 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +16840 -13653
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +2 -2
- package/generator/dead-code-review/elm.json +9 -7
- package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +59 -10
- package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +52 -36
- 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/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/o.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
- package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1527 -422
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25118 -21832
- package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
- package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +2 -2
- package/generator/review/elm.json +10 -10
- package/generator/src/RouteBuilder.elm +93 -128
- package/generator/src/SharedTemplate.elm +8 -7
- package/generator/src/SiteConfig.elm +3 -2
- package/generator/src/basepath-middleware.js +3 -3
- package/generator/src/build.js +147 -63
- package/generator/src/cli.js +292 -88
- package/generator/src/codegen.js +29 -27
- package/generator/src/compatibility-key.js +3 -0
- package/generator/src/compile-elm.js +43 -26
- package/generator/src/config.js +2 -4
- package/generator/src/copy-dir.js +2 -2
- package/generator/src/dev-server.js +159 -92
- package/generator/src/dir-helpers.js +9 -26
- package/generator/src/elm-codegen.js +5 -4
- package/generator/src/elm-file-constants.js +2 -3
- package/generator/src/error-formatter.js +12 -11
- package/generator/src/file-helpers.js +3 -4
- package/generator/src/generate-template-module-connector.js +23 -23
- package/generator/src/init.js +9 -8
- package/generator/src/pre-render-html.js +10 -13
- package/generator/src/render-test.js +109 -0
- package/generator/src/render-worker.js +25 -28
- package/generator/src/render.js +321 -142
- package/generator/src/request-cache.js +265 -162
- package/generator/src/resolve-elm-module.js +64 -0
- package/generator/src/rewrite-client-elm-json.js +6 -5
- package/generator/src/rewrite-elm-json-help.js +56 -0
- package/generator/src/rewrite-elm-json.js +17 -7
- package/generator/src/route-codegen-helpers.js +16 -31
- package/generator/src/seo-renderer.js +12 -7
- package/generator/src/vite-utils.js +1 -2
- package/generator/static-code/elm-pages.js +10 -0
- package/generator/static-code/hmr.js +79 -13
- package/generator/template/app/Api.elm +3 -2
- package/generator/template/app/Effect.elm +155 -0
- package/generator/template/app/ErrorPage.elm +49 -6
- package/generator/template/app/Route/Blog/Slug_.elm +86 -0
- package/generator/template/app/Route/Greet.elm +107 -0
- package/generator/template/app/Route/Hello.elm +119 -0
- package/generator/template/app/Route/Index.elm +26 -25
- package/generator/template/app/Shared.elm +38 -39
- package/generator/template/app/Site.elm +4 -7
- package/generator/template/app/View.elm +9 -8
- package/generator/template/codegen/elm.codegen.json +18 -0
- package/generator/template/custom-backend-task.ts +3 -0
- package/generator/template/elm-pages.config.mjs +13 -0
- package/generator/template/elm-tooling.json +0 -3
- package/generator/template/elm.json +25 -20
- package/generator/template/index.ts +1 -2
- package/generator/template/netlify.toml +4 -1
- package/generator/template/package.json +10 -4
- package/generator/template/script/.elm-pages/compiled-ports/custom-backend-task.mjs +7 -0
- package/generator/template/script/custom-backend-task.ts +3 -0
- package/generator/template/script/elm.json +61 -0
- package/generator/template/script/src/AddRoute.elm +312 -0
- package/generator/template/script/src/Stars.elm +42 -0
- package/package.json +30 -27
- package/src/ApiRoute.elm +249 -85
- package/src/BackendTask/Custom.elm +325 -0
- package/src/BackendTask/Env.elm +90 -0
- package/src/{DataSource → BackendTask}/File.elm +171 -56
- package/src/{DataSource → BackendTask}/Glob.elm +136 -125
- package/src/BackendTask/Http.elm +679 -0
- package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
- package/src/BackendTask/Internal/Request.elm +69 -0
- package/src/BackendTask/Random.elm +79 -0
- package/src/BackendTask/Time.elm +47 -0
- package/src/BackendTask.elm +531 -0
- package/src/FatalError.elm +90 -0
- package/src/FormData.elm +21 -18
- package/src/Head/Seo.elm +4 -4
- package/src/Head.elm +237 -7
- package/src/Internal/ApiRoute.elm +7 -5
- package/src/Internal/Request.elm +84 -4
- package/src/PageServerResponse.elm +6 -1
- package/src/Pages/ConcurrentSubmission.elm +127 -0
- package/src/Pages/Form.elm +340 -0
- package/src/Pages/FormData.elm +19 -0
- package/src/Pages/GeneratorProgramConfig.elm +15 -0
- package/src/Pages/Internal/FatalError.elm +5 -0
- package/src/Pages/Internal/Msg.elm +93 -0
- package/src/Pages/Internal/NotFoundReason.elm +4 -4
- package/src/Pages/Internal/Platform/Cli.elm +629 -767
- package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
- package/src/Pages/Internal/Platform/Effect.elm +1 -2
- package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
- package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
- package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
- package/src/Pages/Internal/Platform.elm +330 -203
- package/src/Pages/Internal/ResponseSketch.elm +2 -2
- package/src/Pages/Internal/Script.elm +17 -0
- package/src/Pages/Internal/StaticHttpBody.elm +35 -1
- package/src/Pages/Manifest.elm +52 -11
- package/src/Pages/Navigation.elm +85 -0
- package/src/Pages/PageUrl.elm +26 -12
- package/src/Pages/ProgramConfig.elm +32 -22
- package/src/Pages/Script.elm +166 -0
- package/src/Pages/SiteConfig.elm +3 -2
- package/src/Pages/StaticHttp/Request.elm +2 -2
- package/src/Pages/StaticHttpRequest.elm +23 -99
- package/src/Pages/Url.elm +3 -3
- package/src/PagesMsg.elm +88 -0
- package/src/QueryParams.elm +21 -172
- package/src/RenderRequest.elm +7 -7
- package/src/RequestsAndPending.elm +37 -20
- package/src/Result/Extra.elm +26 -0
- package/src/Scaffold/Form.elm +569 -0
- package/src/Scaffold/Route.elm +1431 -0
- package/src/Server/Request.elm +476 -1001
- package/src/Server/Response.elm +130 -36
- package/src/Server/Session.elm +181 -111
- package/src/Server/SetCookie.elm +80 -32
- package/src/Stub.elm +53 -0
- package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
- package/src/{Path.elm → UrlPath.elm} +33 -36
- package/generator/template/public/images/icon-png.png +0 -0
- package/src/DataSource/Env.elm +0 -38
- package/src/DataSource/Http.elm +0 -446
- package/src/DataSource/Internal/Request.elm +0 -20
- package/src/DataSource/Port.elm +0 -90
- package/src/DataSource.elm +0 -538
- package/src/Form/Field.elm +0 -717
- package/src/Form/FieldStatus.elm +0 -36
- package/src/Form/FieldView.elm +0 -417
- package/src/Form/FormData.elm +0 -22
- package/src/Form/Validation.elm +0 -391
- package/src/Form/Value.elm +0 -118
- package/src/Form.elm +0 -1683
- package/src/FormDecoder.elm +0 -102
- package/src/Pages/FormState.elm +0 -256
- package/src/Pages/Generate.elm +0 -1151
- package/src/Pages/Internal/Form.elm +0 -17
- package/src/Pages/Msg.elm +0 -79
- package/src/Pages/Transition.elm +0 -70
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
module Pages.Script exposing
|
|
2
|
+
( Script
|
|
3
|
+
, withCliOptions, withoutCliOptions
|
|
4
|
+
, writeFile
|
|
5
|
+
, log
|
|
6
|
+
, Error(..)
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
{-| An elm-pages Script is a way to execute an `elm-pages` `BackendTask`.
|
|
10
|
+
|
|
11
|
+
Read more about using the `elm-pages` CLI to run (or bundle) scripts, plus a brief tutorial, at <https://elm-pages.com/docs/elm-pages-scripts>.
|
|
12
|
+
|
|
13
|
+
@docs Script
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## Defining Scripts
|
|
17
|
+
|
|
18
|
+
@docs withCliOptions, withoutCliOptions
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## File System Utilities
|
|
22
|
+
|
|
23
|
+
@docs writeFile
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Utilities
|
|
27
|
+
|
|
28
|
+
@docs log
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
## Errors
|
|
32
|
+
|
|
33
|
+
@docs Error
|
|
34
|
+
|
|
35
|
+
-}
|
|
36
|
+
|
|
37
|
+
import BackendTask exposing (BackendTask)
|
|
38
|
+
import BackendTask.Http
|
|
39
|
+
import BackendTask.Internal.Request
|
|
40
|
+
import Cli.OptionsParser as OptionsParser
|
|
41
|
+
import Cli.Program as Program
|
|
42
|
+
import FatalError exposing (FatalError)
|
|
43
|
+
import Json.Decode as Decode
|
|
44
|
+
import Json.Encode as Encode
|
|
45
|
+
import Pages.Internal.Script
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
{-| The type for your `run` function that can be executed by `elm-pages run`.
|
|
49
|
+
-}
|
|
50
|
+
type alias Script =
|
|
51
|
+
Pages.Internal.Script.Script
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
{-| The recoverable error type for file writes. You can use `BackendTask.allowFatal` if you want to allow the program to crash
|
|
55
|
+
with an error message if a file write is unsuccessful.
|
|
56
|
+
-}
|
|
57
|
+
type Error
|
|
58
|
+
= --TODO make more descriptive
|
|
59
|
+
FileWriteError
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
{-| Write a file to the file system.
|
|
63
|
+
|
|
64
|
+
module MyScript exposing (run)
|
|
65
|
+
|
|
66
|
+
import BackendTask
|
|
67
|
+
import Pages.Script as Script
|
|
68
|
+
|
|
69
|
+
run =
|
|
70
|
+
Script.withoutCliOptions
|
|
71
|
+
(Script.writeFile
|
|
72
|
+
{ path = "hello.json"
|
|
73
|
+
, body = """{ "message": "Hello, World!" }"""
|
|
74
|
+
}
|
|
75
|
+
|> BackendTask.allowFatal
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
-}
|
|
79
|
+
writeFile : { path : String, body : String } -> BackendTask { fatal : FatalError, recoverable : Error } ()
|
|
80
|
+
writeFile { path, body } =
|
|
81
|
+
BackendTask.Internal.Request.request
|
|
82
|
+
{ name = "write-file"
|
|
83
|
+
, body =
|
|
84
|
+
BackendTask.Http.jsonBody
|
|
85
|
+
(Encode.object
|
|
86
|
+
[ ( "path", Encode.string path )
|
|
87
|
+
, ( "body", Encode.string body )
|
|
88
|
+
]
|
|
89
|
+
)
|
|
90
|
+
, expect =
|
|
91
|
+
-- TODO decode possible error details here
|
|
92
|
+
BackendTask.Http.expectJson (Decode.succeed ())
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
{-| Log to stdout.
|
|
97
|
+
|
|
98
|
+
module MyScript exposing (run)
|
|
99
|
+
|
|
100
|
+
import BackendTask
|
|
101
|
+
import Pages.Script as Script
|
|
102
|
+
|
|
103
|
+
run =
|
|
104
|
+
Script.withoutCliOptions
|
|
105
|
+
(Script.log "Hello!"
|
|
106
|
+
|> BackendTask.allowFatal
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
-}
|
|
110
|
+
log : String -> BackendTask error ()
|
|
111
|
+
log message =
|
|
112
|
+
BackendTask.Internal.Request.request
|
|
113
|
+
{ name = "log"
|
|
114
|
+
, body =
|
|
115
|
+
BackendTask.Http.jsonBody
|
|
116
|
+
(Encode.object
|
|
117
|
+
[ ( "message", Encode.string message )
|
|
118
|
+
]
|
|
119
|
+
)
|
|
120
|
+
, expect = BackendTask.Http.expectJson (Decode.succeed ())
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
{-| Define a simple Script (no CLI Options).
|
|
125
|
+
|
|
126
|
+
module MyScript exposing (run)
|
|
127
|
+
|
|
128
|
+
import BackendTask
|
|
129
|
+
import Pages.Script as Script
|
|
130
|
+
|
|
131
|
+
run =
|
|
132
|
+
Script.withoutCliOptions
|
|
133
|
+
(Script.log "Hello!"
|
|
134
|
+
|> BackendTask.allowFatal
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
-}
|
|
138
|
+
withoutCliOptions : BackendTask FatalError () -> Script
|
|
139
|
+
withoutCliOptions execute =
|
|
140
|
+
Pages.Internal.Script.Script
|
|
141
|
+
(\_ ->
|
|
142
|
+
Program.config
|
|
143
|
+
|> Program.add
|
|
144
|
+
(OptionsParser.build ())
|
|
145
|
+
|> Program.mapConfig
|
|
146
|
+
(\() ->
|
|
147
|
+
execute
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
{-| Same as [`withoutCliOptions`](#withoutCliOptions), but allows you to define a CLI Options Parser so the user can
|
|
153
|
+
pass in additional options for the script.
|
|
154
|
+
|
|
155
|
+
Uses <https://package.elm-lang.org/packages/dillonkearns/elm-cli-options-parser/latest/>.
|
|
156
|
+
|
|
157
|
+
Read more at <https://elm-pages.com/docs/elm-pages-scripts/#adding-command-line-options>.
|
|
158
|
+
|
|
159
|
+
-}
|
|
160
|
+
withCliOptions : Program.Config cliOptions -> (cliOptions -> BackendTask FatalError ()) -> Script
|
|
161
|
+
withCliOptions config execute =
|
|
162
|
+
Pages.Internal.Script.Script
|
|
163
|
+
(\_ ->
|
|
164
|
+
config
|
|
165
|
+
|> Program.mapConfig execute
|
|
166
|
+
)
|
package/src/Pages/SiteConfig.elm
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
module Pages.SiteConfig exposing (SiteConfig)
|
|
2
2
|
|
|
3
|
-
import
|
|
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 :
|
|
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
|
-
,
|
|
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.
|
|
43
|
+
|> Codec.nullableField "cacheOptions" .cacheOptions Codec.value
|
|
44
44
|
|> Codec.buildObject
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve,
|
|
1
|
+
module Pages.StaticHttpRequest exposing (Error(..), MockResolver, RawRequest(..), Status(..), cacheRequestResolution, mockResolve, toBuildError)
|
|
2
2
|
|
|
3
3
|
import BuildError exposing (BuildError)
|
|
4
|
-
import
|
|
5
|
-
import List.Extra
|
|
4
|
+
import Json.Encode
|
|
6
5
|
import Pages.StaticHttp.Request
|
|
7
6
|
import RequestsAndPending exposing (RequestsAndPending)
|
|
8
7
|
import TerminalText as Terminal
|
|
@@ -13,30 +12,19 @@ type alias MockResolver =
|
|
|
13
12
|
-> Maybe RequestsAndPending.Response
|
|
14
13
|
|
|
15
14
|
|
|
16
|
-
type RawRequest value
|
|
17
|
-
= Request (List Pages.StaticHttp.Request.Request) (Maybe MockResolver -> RequestsAndPending -> RawRequest value)
|
|
18
|
-
|
|
|
19
|
-
| ApiRoute value
|
|
15
|
+
type RawRequest error value
|
|
16
|
+
= Request (List Pages.StaticHttp.Request.Request) (Maybe MockResolver -> RequestsAndPending -> RawRequest error value)
|
|
17
|
+
| ApiRoute (Result error value)
|
|
20
18
|
|
|
21
19
|
|
|
22
20
|
type Error
|
|
23
|
-
=
|
|
24
|
-
| DecoderError String
|
|
21
|
+
= DecoderError String
|
|
25
22
|
| UserCalledStaticHttpFail String
|
|
26
23
|
|
|
27
24
|
|
|
28
25
|
toBuildError : String -> Error -> BuildError
|
|
29
26
|
toBuildError path error =
|
|
30
27
|
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
28
|
DecoderError decodeErrorMessage ->
|
|
41
29
|
{ title = "Static Http Decoding Error"
|
|
42
30
|
, message =
|
|
@@ -49,107 +37,43 @@ toBuildError path error =
|
|
|
49
37
|
UserCalledStaticHttpFail decodeErrorMessage ->
|
|
50
38
|
{ title = "Called Static Http Fail"
|
|
51
39
|
, message =
|
|
52
|
-
[ Terminal.text <| "I ran into a call to `
|
|
40
|
+
[ Terminal.text <| "I ran into a call to `BackendTask.fail` with message: " ++ decodeErrorMessage
|
|
53
41
|
]
|
|
54
42
|
, path = path
|
|
55
43
|
, fatal = True
|
|
56
44
|
}
|
|
57
45
|
|
|
58
46
|
|
|
59
|
-
|
|
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
|
|
47
|
+
mockResolve : RawRequest error value -> MockResolver -> Result error value
|
|
75
48
|
mockResolve request mockResolver =
|
|
76
49
|
case request of
|
|
77
|
-
RequestError error ->
|
|
78
|
-
Err error
|
|
79
|
-
|
|
80
50
|
Request _ lookupFn ->
|
|
81
|
-
case lookupFn (Just mockResolver)
|
|
51
|
+
case lookupFn (Just mockResolver) (Json.Encode.object []) of
|
|
82
52
|
nextRequest ->
|
|
83
53
|
mockResolve nextRequest mockResolver
|
|
84
54
|
|
|
85
55
|
ApiRoute value ->
|
|
86
|
-
|
|
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
|
|
56
|
+
value
|
|
114
57
|
|
|
115
58
|
|
|
116
59
|
cacheRequestResolution :
|
|
117
|
-
RawRequest value
|
|
60
|
+
RawRequest error value
|
|
118
61
|
-> RequestsAndPending
|
|
119
|
-
-> Status value
|
|
62
|
+
-> Status error value
|
|
120
63
|
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
64
|
case request of
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
-- TODO do I need to pass through continuation URLs here? -- Incomplete (urlList ++ foundUrls)
|
|
141
|
-
Incomplete foundUrls
|
|
65
|
+
Request urlList lookupFn ->
|
|
66
|
+
if List.isEmpty urlList then
|
|
67
|
+
cacheRequestResolution (lookupFn Nothing rawResponses) rawResponses
|
|
142
68
|
|
|
143
|
-
|
|
144
|
-
|
|
69
|
+
else
|
|
70
|
+
Incomplete urlList (Request [] lookupFn)
|
|
145
71
|
|
|
146
|
-
|
|
147
|
-
|
|
72
|
+
ApiRoute value ->
|
|
73
|
+
Complete value
|
|
148
74
|
|
|
149
|
-
Request urlList lookupFn ->
|
|
150
|
-
cacheRequestResolutionHelp urlList
|
|
151
|
-
rawResponses
|
|
152
|
-
(lookupFn Nothing rawResponses)
|
|
153
75
|
|
|
154
|
-
|
|
155
|
-
|
|
76
|
+
type Status error value
|
|
77
|
+
= Incomplete (List Pages.StaticHttp.Request.Request) (RawRequest error value)
|
|
78
|
+
| HasPermanentError Error
|
|
79
|
+
| Complete (Result error value)
|
package/src/Pages/Url.elm
CHANGED
|
@@ -12,7 +12,7 @@ If you refer to a local page, like `Route.Index |> Route.toPath |> Pages.Url.fro
|
|
|
12
12
|
-}
|
|
13
13
|
|
|
14
14
|
import Pages.Internal.String as String
|
|
15
|
-
import
|
|
15
|
+
import UrlPath exposing (UrlPath)
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
{-| -}
|
|
@@ -22,9 +22,9 @@ type Url
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
{-| -}
|
|
25
|
-
fromPath :
|
|
25
|
+
fromPath : UrlPath -> Url
|
|
26
26
|
fromPath path =
|
|
27
|
-
path |>
|
|
27
|
+
path |> UrlPath.toAbsolute |> Internal
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
{-| -}
|
package/src/PagesMsg.elm
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module PagesMsg exposing
|
|
2
|
+
( PagesMsg
|
|
3
|
+
, fromMsg
|
|
4
|
+
, map, noOp
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
{-| In `elm-pages`, Route modules have their own `Msg` type which can be used like a normal TEA (The Elm Architecture) app.
|
|
8
|
+
But the `Msg` defined in a `Route` module is wrapped in the `PagesMsg` type.
|
|
9
|
+
|
|
10
|
+
@docs PagesMsg
|
|
11
|
+
|
|
12
|
+
You can wrap your Route Module's `Msg` using `fromMsg`.
|
|
13
|
+
|
|
14
|
+
@docs fromMsg
|
|
15
|
+
|
|
16
|
+
@docs map, noOp
|
|
17
|
+
|
|
18
|
+
-}
|
|
19
|
+
|
|
20
|
+
import Pages.Internal.Msg
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
{-| -}
|
|
24
|
+
type alias PagesMsg userMsg =
|
|
25
|
+
Pages.Internal.Msg.Msg userMsg
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
{-|
|
|
29
|
+
|
|
30
|
+
import Form
|
|
31
|
+
import Pages.Form
|
|
32
|
+
import PagesMsg exposing (PagesMsg)
|
|
33
|
+
|
|
34
|
+
type Msg
|
|
35
|
+
= ToggleMenu
|
|
36
|
+
|
|
37
|
+
view :
|
|
38
|
+
Maybe PageUrl
|
|
39
|
+
-> Shared.Model
|
|
40
|
+
-> Model
|
|
41
|
+
-> App Data ActionData RouteParams
|
|
42
|
+
-> View (PagesMsg Msg)
|
|
43
|
+
view maybeUrl sharedModel model app =
|
|
44
|
+
{ title = "My Page"
|
|
45
|
+
, view =
|
|
46
|
+
[ button
|
|
47
|
+
-- we need to wrap our Route module's `Msg` here so we have a `PagesMsg Msg`
|
|
48
|
+
[ onClick (PagesMsg.fromMsg ToggleMenu) ]
|
|
49
|
+
[]
|
|
50
|
+
|
|
51
|
+
-- `Pages.Form.renderHtml` gives us `Html (PagesMsg msg)`, so we don't need to wrap its Msg type
|
|
52
|
+
, logoutForm
|
|
53
|
+
|> Pages.Form.renderHtml []
|
|
54
|
+
Pages.Form.Serial
|
|
55
|
+
(Form.options "logout"
|
|
56
|
+
|> Form.withOnSubmit (\_ -> NewItemSubmitted)
|
|
57
|
+
)
|
|
58
|
+
app
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
-}
|
|
63
|
+
fromMsg : userMsg -> PagesMsg userMsg
|
|
64
|
+
fromMsg userMsg =
|
|
65
|
+
Pages.Internal.Msg.UserMsg userMsg
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
{-| A Msg that is handled by the elm-pages framework and does nothing. Helpful for when you don't want to register a callback.
|
|
69
|
+
|
|
70
|
+
import Browser.Dom as Dom
|
|
71
|
+
import PagesMsg exposing (PagesMsg)
|
|
72
|
+
import Task
|
|
73
|
+
|
|
74
|
+
resetViewport : Cmd (PagesMsg msg)
|
|
75
|
+
resetViewport =
|
|
76
|
+
Dom.setViewport 0 0
|
|
77
|
+
|> Task.perform (\() -> PagesMsg.noOp)
|
|
78
|
+
|
|
79
|
+
-}
|
|
80
|
+
noOp : PagesMsg userMsg
|
|
81
|
+
noOp =
|
|
82
|
+
Pages.Internal.Msg.NoOp
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
{-| -}
|
|
86
|
+
map : (a -> b) -> PagesMsg a -> PagesMsg b
|
|
87
|
+
map mapFn msg =
|
|
88
|
+
Pages.Internal.Msg.map mapFn msg
|
package/src/QueryParams.elm
CHANGED
|
@@ -1,189 +1,38 @@
|
|
|
1
1
|
module QueryParams exposing
|
|
2
2
|
( QueryParams
|
|
3
|
-
,
|
|
4
|
-
,
|
|
5
|
-
, map2, oneOf
|
|
6
|
-
, toDict, toString
|
|
3
|
+
, fromString
|
|
4
|
+
, toString
|
|
7
5
|
)
|
|
8
6
|
|
|
9
|
-
{-| Represents the query portion of a URL. You can use `toDict` or `toString` to turn it into basic types, or you can
|
|
10
|
-
parse it into a custom type using the other functions in this module.
|
|
11
|
-
|
|
12
|
-
@docs QueryParams
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
## Parsing
|
|
16
|
-
|
|
17
|
-
@docs Parser
|
|
18
|
-
|
|
19
|
-
@docs andThen, fail, fromResult, fromString, optionalString, parse, string, strings, succeed
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
## Combining
|
|
23
|
-
|
|
24
|
-
@docs map2, oneOf
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
## Accessing as Built-In Types
|
|
28
|
-
|
|
29
|
-
@docs toDict, toString
|
|
30
|
-
|
|
31
|
-
-}
|
|
32
|
-
|
|
33
7
|
import Dict exposing (Dict)
|
|
34
8
|
import Url
|
|
35
9
|
|
|
36
10
|
|
|
37
11
|
{-| -}
|
|
38
|
-
type QueryParams
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
{-| -}
|
|
43
|
-
type Parser a
|
|
44
|
-
= Parser (Dict String (List String) -> Result String a)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
{-| -}
|
|
48
|
-
succeed : a -> Parser a
|
|
49
|
-
succeed value =
|
|
50
|
-
Parser (\_ -> Ok value)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
{-| -}
|
|
54
|
-
fail : String -> Parser a
|
|
55
|
-
fail errorMessage =
|
|
56
|
-
Parser (\_ -> Err errorMessage)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
{-| -}
|
|
60
|
-
fromResult : Result String a -> Parser a
|
|
61
|
-
fromResult result =
|
|
62
|
-
Parser (\_ -> result)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
{-| -}
|
|
66
|
-
andThen : (a -> Parser b) -> Parser a -> Parser b
|
|
67
|
-
andThen andThenFn (Parser parser) =
|
|
68
|
-
Parser
|
|
69
|
-
(\dict ->
|
|
70
|
-
case Result.map andThenFn (parser dict) of
|
|
71
|
-
Ok (Parser result) ->
|
|
72
|
-
result dict
|
|
73
|
-
|
|
74
|
-
Err error ->
|
|
75
|
-
Err error
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
{-| -}
|
|
80
|
-
oneOf : List (Parser a) -> Parser a
|
|
81
|
-
oneOf parsers =
|
|
82
|
-
Parser
|
|
83
|
-
(tryParser parsers)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
{-| -}
|
|
87
|
-
tryParser : List (Parser a) -> Dict String (List String) -> Result String a
|
|
88
|
-
tryParser parsers dict =
|
|
89
|
-
case parsers of
|
|
90
|
-
[] ->
|
|
91
|
-
Err ""
|
|
92
|
-
|
|
93
|
-
(Parser nextParser) :: otherParsers ->
|
|
94
|
-
case nextParser dict of
|
|
95
|
-
Ok okValue ->
|
|
96
|
-
Ok okValue
|
|
97
|
-
|
|
98
|
-
Err _ ->
|
|
99
|
-
tryParser otherParsers dict
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
{-| -}
|
|
103
|
-
map2 : (a -> b -> combined) -> Parser a -> Parser b -> Parser combined
|
|
104
|
-
map2 func (Parser a) (Parser b) =
|
|
105
|
-
Parser <|
|
|
106
|
-
\dict ->
|
|
107
|
-
Result.map2 func (a dict) (b dict)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
{-| -}
|
|
111
|
-
optionalString : String -> Parser (Maybe String)
|
|
112
|
-
optionalString key =
|
|
113
|
-
custom key
|
|
114
|
-
(\stringList ->
|
|
115
|
-
case stringList of
|
|
116
|
-
str :: _ ->
|
|
117
|
-
Ok (Just str)
|
|
118
|
-
|
|
119
|
-
_ ->
|
|
120
|
-
Ok Nothing
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
{-| -}
|
|
125
|
-
string : String -> Parser String
|
|
126
|
-
string key =
|
|
127
|
-
custom key
|
|
128
|
-
(\stringList ->
|
|
129
|
-
case stringList of
|
|
130
|
-
[ str ] ->
|
|
131
|
-
Ok str
|
|
132
|
-
|
|
133
|
-
_ ->
|
|
134
|
-
Err ("Missing key " ++ key)
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
{-| -}
|
|
139
|
-
custom : String -> (List String -> Result String a) -> Parser a
|
|
140
|
-
custom key customFn =
|
|
141
|
-
Parser <|
|
|
142
|
-
\dict ->
|
|
143
|
-
customFn (Maybe.withDefault [] (Dict.get key dict))
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
{-| -}
|
|
147
|
-
strings : String -> Parser (List String)
|
|
148
|
-
strings key =
|
|
149
|
-
custom key
|
|
150
|
-
(\stringList -> Ok stringList)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
{-| -}
|
|
154
|
-
fromString : String -> QueryParams
|
|
155
|
-
fromString =
|
|
156
|
-
QueryParams
|
|
12
|
+
type alias QueryParams =
|
|
13
|
+
Dict String (List String)
|
|
157
14
|
|
|
158
15
|
|
|
159
16
|
{-| -}
|
|
160
17
|
toString : QueryParams -> String
|
|
161
|
-
toString
|
|
18
|
+
toString queryParams =
|
|
162
19
|
queryParams
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
prepareQuery : Maybe String -> Dict String (List String)
|
|
180
|
-
prepareQuery maybeQuery =
|
|
181
|
-
case maybeQuery of
|
|
182
|
-
Nothing ->
|
|
183
|
-
Dict.empty
|
|
184
|
-
|
|
185
|
-
Just qry ->
|
|
186
|
-
List.foldr addParam Dict.empty (String.split "&" qry)
|
|
20
|
+
|> Dict.toList
|
|
21
|
+
|> List.concatMap
|
|
22
|
+
(\( key, values ) ->
|
|
23
|
+
values
|
|
24
|
+
|> List.map
|
|
25
|
+
(\value ->
|
|
26
|
+
key ++ "=" ++ value
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
|> String.join "&"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
{-| -}
|
|
33
|
+
fromString : String -> Dict String (List String)
|
|
34
|
+
fromString query =
|
|
35
|
+
List.foldr addParam Dict.empty (String.split "&" query)
|
|
187
36
|
|
|
188
37
|
|
|
189
38
|
addParam : String -> Dict String (List String) -> Dict String (List String)
|