elm-pages 3.0.0-beta.4 → 3.0.0-beta.41

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 (148) hide show
  1. package/README.md +10 -1
  2. package/adapter/netlify.js +207 -0
  3. package/codegen/{elm-pages-codegen.js → elm-pages-codegen.cjs} +2828 -2933
  4. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  5. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  6. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  7. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  8. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  9. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  10. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +1 -1
  11. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1447 -342
  12. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +17004 -13817
  13. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  14. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
  15. package/generator/dead-code-review/elm.json +9 -7
  16. package/generator/dead-code-review/src/Pages/Review/DeadCodeEliminateData.elm +59 -10
  17. package/generator/dead-code-review/tests/Pages/Review/DeadCodeEliminateDataTest.elm +52 -36
  18. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
  19. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
  20. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
  21. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
  22. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  23. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  24. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  25. package/generator/review/elm-stuff/tests-0.19.1/elm.json +1 -1
  26. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +1447 -342
  27. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +25025 -21739
  28. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +1 -1
  29. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +4 -4
  30. package/generator/review/elm.json +10 -10
  31. package/generator/src/RouteBuilder.elm +121 -114
  32. package/generator/src/SharedTemplate.elm +8 -7
  33. package/generator/src/SiteConfig.elm +3 -2
  34. package/generator/src/basepath-middleware.js +3 -3
  35. package/generator/src/build.js +209 -92
  36. package/generator/src/cli.js +292 -88
  37. package/generator/src/codegen.js +29 -27
  38. package/generator/src/compatibility-key.js +3 -0
  39. package/generator/src/compile-elm.js +43 -26
  40. package/generator/src/config.js +39 -0
  41. package/generator/src/copy-dir.js +2 -2
  42. package/generator/src/dev-server.js +176 -138
  43. package/generator/src/dir-helpers.js +9 -26
  44. package/generator/src/elm-codegen.js +5 -4
  45. package/generator/src/elm-file-constants.js +2 -3
  46. package/generator/src/error-formatter.js +12 -11
  47. package/generator/src/file-helpers.js +3 -4
  48. package/generator/src/generate-template-module-connector.js +23 -23
  49. package/generator/src/init.js +9 -8
  50. package/generator/src/pre-render-html.js +39 -28
  51. package/generator/src/render-test.js +109 -0
  52. package/generator/src/render-worker.js +25 -28
  53. package/generator/src/render.js +321 -142
  54. package/generator/src/request-cache.js +265 -162
  55. package/generator/src/resolve-elm-module.js +64 -0
  56. package/generator/src/rewrite-client-elm-json.js +6 -5
  57. package/generator/src/rewrite-elm-json-help.js +56 -0
  58. package/generator/src/rewrite-elm-json.js +17 -7
  59. package/generator/src/route-codegen-helpers.js +16 -31
  60. package/generator/src/seo-renderer.js +12 -7
  61. package/generator/src/vite-utils.js +77 -0
  62. package/generator/static-code/elm-pages.js +10 -0
  63. package/generator/static-code/hmr.js +79 -13
  64. package/generator/template/app/Api.elm +6 -5
  65. package/generator/template/app/Effect.elm +123 -0
  66. package/generator/template/app/ErrorPage.elm +37 -6
  67. package/generator/template/app/Route/Index.elm +17 -10
  68. package/generator/template/app/Shared.elm +24 -47
  69. package/generator/template/app/Site.elm +19 -6
  70. package/generator/template/app/View.elm +1 -8
  71. package/generator/template/elm-tooling.json +0 -3
  72. package/generator/template/elm.json +32 -24
  73. package/generator/template/package.json +10 -4
  74. package/package.json +30 -27
  75. package/src/ApiRoute.elm +199 -61
  76. package/src/BackendTask/Custom.elm +325 -0
  77. package/src/BackendTask/Env.elm +90 -0
  78. package/src/{DataSource → BackendTask}/File.elm +171 -56
  79. package/src/{DataSource → BackendTask}/Glob.elm +136 -125
  80. package/src/BackendTask/Http.elm +679 -0
  81. package/src/{DataSource → BackendTask}/Internal/Glob.elm +1 -1
  82. package/src/BackendTask/Internal/Request.elm +69 -0
  83. package/src/BackendTask/Random.elm +79 -0
  84. package/src/BackendTask/Time.elm +47 -0
  85. package/src/BackendTask.elm +531 -0
  86. package/src/FatalError.elm +90 -0
  87. package/src/Head/Seo.elm +4 -4
  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/ConcurrentSubmission.elm +127 -0
  93. package/src/Pages/Form.elm +340 -0
  94. package/src/Pages/FormData.elm +18 -0
  95. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  96. package/src/Pages/Internal/FatalError.elm +5 -0
  97. package/src/Pages/Internal/Msg.elm +93 -0
  98. package/src/Pages/Internal/NotFoundReason.elm +4 -4
  99. package/src/Pages/Internal/Platform/Cli.elm +617 -768
  100. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  101. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  102. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  103. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  104. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  105. package/src/Pages/Internal/Platform.elm +359 -225
  106. package/src/Pages/Internal/ResponseSketch.elm +2 -2
  107. package/src/Pages/Internal/Script.elm +17 -0
  108. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  109. package/src/Pages/Manifest.elm +52 -11
  110. package/src/Pages/Navigation.elm +87 -0
  111. package/src/Pages/PageUrl.elm +26 -12
  112. package/src/Pages/ProgramConfig.elm +35 -23
  113. package/src/Pages/Script.elm +166 -0
  114. package/src/Pages/SiteConfig.elm +3 -2
  115. package/src/Pages/StaticHttp/Request.elm +2 -2
  116. package/src/Pages/StaticHttpRequest.elm +23 -99
  117. package/src/Pages/Url.elm +3 -3
  118. package/src/PagesMsg.elm +88 -0
  119. package/src/QueryParams.elm +21 -172
  120. package/src/RenderRequest.elm +7 -7
  121. package/src/RequestsAndPending.elm +37 -20
  122. package/src/Result/Extra.elm +26 -0
  123. package/src/Scaffold/Form.elm +569 -0
  124. package/src/Scaffold/Route.elm +1411 -0
  125. package/src/Server/Request.elm +74 -72
  126. package/src/Server/Session.elm +62 -42
  127. package/src/Server/SetCookie.elm +80 -32
  128. package/src/Stub.elm +53 -0
  129. package/src/Test/Html/Internal/ElmHtml/ToString.elm +8 -9
  130. package/src/{Path.elm → UrlPath.elm} +33 -36
  131. package/src/DataSource/Env.elm +0 -38
  132. package/src/DataSource/Http.elm +0 -446
  133. package/src/DataSource/Internal/Request.elm +0 -20
  134. package/src/DataSource/Port.elm +0 -90
  135. package/src/DataSource.elm +0 -538
  136. package/src/Form/Field.elm +0 -717
  137. package/src/Form/FieldStatus.elm +0 -36
  138. package/src/Form/FieldView.elm +0 -417
  139. package/src/Form/FormData.elm +0 -22
  140. package/src/Form/Validation.elm +0 -391
  141. package/src/Form/Value.elm +0 -118
  142. package/src/Form.elm +0 -1683
  143. package/src/FormDecoder.elm +0 -102
  144. package/src/Pages/FormState.elm +0 -256
  145. package/src/Pages/Generate.elm +0 -800
  146. package/src/Pages/Internal/Form.elm +0 -17
  147. package/src/Pages/Msg.elm +0 -79
  148. 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-v3.netlify.app/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-v3.netlify.app/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
+ )
@@ -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,7 @@
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
- import Dict
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
- | RequestError Error
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
- = MissingHttpResponse String (List Pages.StaticHttp.Request.Request)
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 `DataSource.fail` with message: " ++ decodeErrorMessage
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
- 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
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) Dict.empty of
51
+ case lookupFn (Just mockResolver) (Json.Encode.object []) of
82
52
  nextRequest ->
83
53
  mockResolve nextRequest mockResolver
84
54
 
85
55
  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
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
- 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
65
+ Request urlList lookupFn ->
66
+ if List.isEmpty urlList then
67
+ cacheRequestResolution (lookupFn Nothing rawResponses) rawResponses
142
68
 
143
- DecoderError _ ->
144
- HasPermanentError error
69
+ else
70
+ Incomplete urlList (Request [] lookupFn)
145
71
 
146
- UserCalledStaticHttpFail _ ->
147
- HasPermanentError error
72
+ ApiRoute value ->
73
+ Complete value
148
74
 
149
- Request urlList lookupFn ->
150
- cacheRequestResolutionHelp urlList
151
- rawResponses
152
- (lookupFn Nothing rawResponses)
153
75
 
154
- ApiRoute _ ->
155
- Complete
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 Path exposing (Path)
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 : Path -> Url
25
+ fromPath : UrlPath -> Url
26
26
  fromPath path =
27
- path |> Path.toAbsolute |> Internal
27
+ path |> UrlPath.toAbsolute |> Internal
28
28
 
29
29
 
30
30
  {-| -}
@@ -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
@@ -1,189 +1,38 @@
1
1
  module QueryParams exposing
2
2
  ( QueryParams
3
- , Parser
4
- , andThen, fail, fromResult, fromString, optionalString, parse, string, strings, succeed
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
- = QueryParams String
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 (QueryParams queryParams) =
18
+ toString queryParams =
162
19
  queryParams
163
-
164
-
165
- {-| -}
166
- parse : Parser a -> QueryParams -> Result String a
167
- parse (Parser queryParser) queryParams =
168
- queryParams
169
- |> toDict
170
- |> queryParser
171
-
172
-
173
- {-| -}
174
- toDict : QueryParams -> Dict String (List String)
175
- toDict (QueryParams queryParams) =
176
- prepareQuery (Just queryParams)
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)