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

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 (140) 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} +2678 -2725
  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 +115 -109
  32. package/generator/src/SharedTemplate.elm +3 -2
  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 +537 -0
  86. package/src/FatalError.elm +90 -0
  87. package/src/Head.elm +237 -7
  88. package/src/HtmlPrinter.elm +7 -3
  89. package/src/Internal/ApiRoute.elm +7 -5
  90. package/src/PageServerResponse.elm +6 -1
  91. package/src/Pages/Form.elm +229 -0
  92. package/src/Pages/GeneratorProgramConfig.elm +15 -0
  93. package/src/Pages/Internal/FatalError.elm +5 -0
  94. package/src/Pages/Internal/Msg.elm +93 -0
  95. package/src/Pages/Internal/Platform/Cli.elm +612 -763
  96. package/src/Pages/Internal/Platform/CompatibilityKey.elm +6 -0
  97. package/src/Pages/Internal/Platform/Effect.elm +1 -2
  98. package/src/Pages/Internal/Platform/GeneratorApplication.elm +379 -0
  99. package/src/Pages/Internal/Platform/StaticResponses.elm +65 -276
  100. package/src/Pages/Internal/Platform/ToJsPayload.elm +6 -9
  101. package/src/Pages/Internal/Platform.elm +327 -194
  102. package/src/Pages/Internal/Script.elm +17 -0
  103. package/src/Pages/Internal/StaticHttpBody.elm +35 -1
  104. package/src/Pages/Manifest.elm +29 -4
  105. package/src/Pages/PageUrl.elm +23 -9
  106. package/src/Pages/ProgramConfig.elm +26 -15
  107. package/src/Pages/Script.elm +109 -0
  108. package/src/Pages/SiteConfig.elm +3 -2
  109. package/src/Pages/StaticHttp/Request.elm +2 -2
  110. package/src/Pages/StaticHttpRequest.elm +23 -99
  111. package/src/Pages/Transition.elm +12 -3
  112. package/src/PagesMsg.elm +82 -0
  113. package/src/Path.elm +16 -19
  114. package/src/QueryParams.elm +21 -172
  115. package/src/RequestsAndPending.elm +37 -20
  116. package/src/Result/Extra.elm +26 -0
  117. package/src/Scaffold/Form.elm +546 -0
  118. package/src/Scaffold/Route.elm +1402 -0
  119. package/src/Server/Request.elm +73 -72
  120. package/src/Server/Session.elm +62 -42
  121. package/src/Server/SetCookie.elm +12 -4
  122. package/src/Stub.elm +53 -0
  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/Form/Field.elm +0 -717
  130. package/src/Form/FieldStatus.elm +0 -36
  131. package/src/Form/FieldView.elm +0 -417
  132. package/src/Form/FormData.elm +0 -22
  133. package/src/Form/Validation.elm +0 -391
  134. package/src/Form/Value.elm +0 -118
  135. package/src/Form.elm +0 -1683
  136. package/src/FormDecoder.elm +0 -102
  137. package/src/Pages/FormState.elm +0 -256
  138. package/src/Pages/Generate.elm +0 -800
  139. package/src/Pages/Internal/Form.elm +0 -17
  140. package/src/Pages/Msg.elm +0 -79
@@ -0,0 +1,82 @@
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 PagesMsg exposing (PagesMsg)
31
+
32
+ type Msg
33
+ = ToggleMenu
34
+
35
+ view :
36
+ Maybe PageUrl
37
+ -> Shared.Model
38
+ -> Model
39
+ -> App Data ActionData RouteParams
40
+ -> View (PagesMsg Msg)
41
+ view maybeUrl sharedModel model app =
42
+ { title = "My Page"
43
+ , view =
44
+ [ button
45
+ -- we need to wrap our Route module's `Msg` here so we have a `PagesMsg Msg`
46
+ [ onClick (PagesMsg.fromMsg ToggleMenu) ]
47
+ []
48
+
49
+ -- `Form.renderHtml` gives us `Html (PagesMsg msg)`, so we don't need to wrap its Msg type
50
+ , logoutForm
51
+ |> Form.withOnSubmit (\_ -> NewItemSubmitted)
52
+ |> Form.renderHtml "logout" [] (\_ -> Nothing) app Nothing
53
+ ]
54
+ }
55
+
56
+ -}
57
+ fromMsg : userMsg -> PagesMsg userMsg
58
+ fromMsg userMsg =
59
+ Pages.Internal.Msg.UserMsg userMsg
60
+
61
+
62
+ {-| A Msg that is handled by the elm-pages framework and does nothing. Helpful for when you don't want to register a callback.
63
+
64
+ import Browser.Dom as Dom
65
+ import PagesMsg exposing (PagesMsg)
66
+ import Task
67
+
68
+ resetViewport : Cmd (PagesMsg msg)
69
+ resetViewport =
70
+ Dom.setViewport 0 0
71
+ |> Task.perform (\() -> PagesMsg.noOp)
72
+
73
+ -}
74
+ noOp : PagesMsg userMsg
75
+ noOp =
76
+ Pages.Internal.Msg.NoOp
77
+
78
+
79
+ {-| -}
80
+ map : (a -> b) -> PagesMsg a -> PagesMsg b
81
+ map mapFn msg =
82
+ Pages.Internal.Msg.map mapFn msg
package/src/Path.elm CHANGED
@@ -40,20 +40,25 @@ import Pages.Internal.String exposing (chopEnd, chopStart)
40
40
 
41
41
  {-| The path portion of the URL, normalized to ensure that path segments are joined with `/`s in the right places (no doubled up or missing slashes).
42
42
  -}
43
- type Path
44
- = Path String
43
+ type alias Path =
44
+ List String
45
45
 
46
46
 
47
- {-| Create a Path from multiple path parts. Each part can either be a single path segment, like `blog`, or a
48
- multi-part path part, like `blog/post-1`.
47
+ {-| Turn a Path to a relative URL.
49
48
  -}
50
- join : List String -> Path
49
+ join : Path -> Path
51
50
  join parts =
52
51
  parts
53
52
  |> List.filter (\segment -> segment /= "/")
54
53
  |> List.map normalize
54
+
55
+
56
+ {-| Turn a Path to a relative URL.
57
+ -}
58
+ toRelative : Path -> String
59
+ toRelative parts =
60
+ join parts
55
61
  |> String.join "/"
56
- |> Path
57
62
 
58
63
 
59
64
  {-| Create a Path from a path String.
@@ -66,28 +71,20 @@ join parts =
66
71
  fromString : String -> Path
67
72
  fromString path =
68
73
  path
69
- |> normalize
70
- |> Path
74
+ |> toSegments
71
75
 
72
76
 
73
77
  {-| -}
74
- toSegments : Path -> List String
75
- toSegments (Path path) =
78
+ toSegments : String -> List String
79
+ toSegments path =
76
80
  path |> String.split "/" |> List.filter ((/=) "")
77
81
 
78
82
 
79
83
  {-| Turn a Path to an absolute URL (with no trailing slash).
80
84
  -}
81
85
  toAbsolute : Path -> String
82
- toAbsolute (Path path) =
83
- "/" ++ path
84
-
85
-
86
- {-| Turn a Path to a relative URL.
87
- -}
88
- toRelative : Path -> String
89
- toRelative (Path path) =
90
- path
86
+ toAbsolute path =
87
+ "/" ++ toRelative path
91
88
 
92
89
 
93
90
  normalize : String -> String
@@ -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)
@@ -1,16 +1,14 @@
1
- module RequestsAndPending exposing (RequestsAndPending, Response(..), ResponseBody(..), batchDecoder, bodyEncoder, decoder, get)
1
+ module RequestsAndPending exposing (HttpError(..), RawResponse, RequestsAndPending, Response(..), ResponseBody(..), bodyEncoder, get)
2
2
 
3
3
  import Base64
4
4
  import Bytes exposing (Bytes)
5
- import Codec
6
5
  import Dict exposing (Dict)
7
6
  import Json.Decode as Decode exposing (Decoder)
8
7
  import Json.Encode as Encode
9
- import Pages.StaticHttp.Request
10
8
 
11
9
 
12
10
  type alias RequestsAndPending =
13
- Dict String (Maybe Response)
11
+ Decode.Value
14
12
 
15
13
 
16
14
  type ResponseBody
@@ -20,18 +18,6 @@ type ResponseBody
20
18
  | WhateverBody
21
19
 
22
20
 
23
- batchDecoder : Decoder (List { request : Pages.StaticHttp.Request.Request, response : Response })
24
- batchDecoder =
25
- Decode.map2 (\request response -> { request = request, response = response })
26
- (Decode.field "request"
27
- (Pages.StaticHttp.Request.codec
28
- |> Codec.decoder
29
- )
30
- )
31
- (Decode.field "response" decoder)
32
- |> Decode.list
33
-
34
-
35
21
  decoder : Decoder Response
36
22
  decoder =
37
23
  Decode.map2 Response
@@ -115,8 +101,39 @@ responseDecoder =
115
101
  (Decode.field "url" Decode.string)
116
102
 
117
103
 
118
- get : String -> RequestsAndPending -> Maybe Response
104
+ get : String -> RequestsAndPending -> Maybe (Result HttpError Response)
119
105
  get key requestsAndPending =
120
- requestsAndPending
121
- |> Dict.get key
122
- |> Maybe.andThen identity
106
+ Decode.decodeValue
107
+ (Decode.field key
108
+ (Decode.field "response"
109
+ (Decode.oneOf
110
+ [ Decode.field "elm-pages-internal-error" errorDecoder |> Decode.map Err
111
+ , decoder |> Decode.map Ok
112
+ ]
113
+ )
114
+ )
115
+ )
116
+ requestsAndPending
117
+ |> Result.toMaybe
118
+
119
+
120
+ type HttpError
121
+ = NetworkError
122
+ | Timeout
123
+
124
+
125
+ errorDecoder : Decoder HttpError
126
+ errorDecoder =
127
+ Decode.string
128
+ |> Decode.andThen
129
+ (\errorCode ->
130
+ case errorCode of
131
+ "NetworkError" ->
132
+ Decode.succeed NetworkError
133
+
134
+ "Timeout" ->
135
+ Decode.succeed Timeout
136
+
137
+ _ ->
138
+ Decode.fail "Unhandled error code."
139
+ )
@@ -0,0 +1,26 @@
1
+ module Result.Extra exposing (combine, isOk, merge)
2
+
3
+
4
+ isOk : Result x a -> Bool
5
+ isOk result =
6
+ case result of
7
+ Ok _ ->
8
+ True
9
+
10
+ Err _ ->
11
+ False
12
+
13
+
14
+ merge : Result a a -> a
15
+ merge r =
16
+ case r of
17
+ Ok rr ->
18
+ rr
19
+
20
+ Err rr ->
21
+ rr
22
+
23
+
24
+ combine : List (Result x a) -> Result x (List a)
25
+ combine =
26
+ List.foldr (Result.map2 (::)) (Ok [])