elm-pages 2.1.10 → 3.0.0-beta.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/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/{template/public/style.css → 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 +120 -924
- 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 +14 -5
- package/generator/template/{public/index.js → index.ts} +7 -3
- package/generator/template/package.json +5 -5
- 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 +30 -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
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Pages.Fetcher exposing (Fetcher(..), FetcherInfo, submit, map)
|
|
2
|
+
|
|
3
|
+
{-|
|
|
4
|
+
|
|
5
|
+
@docs Fetcher, FetcherInfo, submit, map
|
|
6
|
+
|
|
7
|
+
-}
|
|
8
|
+
|
|
9
|
+
import Bytes exposing (Bytes)
|
|
10
|
+
import Bytes.Decode
|
|
11
|
+
import Http
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
{-| -}
|
|
15
|
+
type Fetcher decoded
|
|
16
|
+
= Fetcher (FetcherInfo decoded)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
{-| -}
|
|
20
|
+
type alias FetcherInfo decoded =
|
|
21
|
+
{ decoder : Result Http.Error Bytes -> decoded
|
|
22
|
+
, fields : List ( String, String )
|
|
23
|
+
, headers : List ( String, String )
|
|
24
|
+
, url : Maybe String
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
{-| -}
|
|
29
|
+
submit :
|
|
30
|
+
Bytes.Decode.Decoder decoded
|
|
31
|
+
-> { fields : List ( String, String ), headers : List ( String, String ) }
|
|
32
|
+
-> Fetcher (Result Http.Error decoded)
|
|
33
|
+
submit byteDecoder options =
|
|
34
|
+
Fetcher
|
|
35
|
+
{ decoder =
|
|
36
|
+
\bytesResult ->
|
|
37
|
+
bytesResult
|
|
38
|
+
|> Result.andThen
|
|
39
|
+
(\okBytes ->
|
|
40
|
+
okBytes
|
|
41
|
+
|> Bytes.Decode.decode byteDecoder
|
|
42
|
+
|> Result.fromMaybe (Http.BadBody "Couldn't decode bytes.")
|
|
43
|
+
)
|
|
44
|
+
, fields = options.fields
|
|
45
|
+
, headers = ( "elm-pages-action-only", "true" ) :: options.headers
|
|
46
|
+
, url = Nothing
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
{-| -}
|
|
51
|
+
map : (a -> b) -> Fetcher a -> Fetcher b
|
|
52
|
+
map mapFn (Fetcher fetcher) =
|
|
53
|
+
Fetcher
|
|
54
|
+
{ decoder = fetcher.decoder >> mapFn
|
|
55
|
+
, fields = fetcher.fields
|
|
56
|
+
, headers = fetcher.headers
|
|
57
|
+
, url = fetcher.url
|
|
58
|
+
}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
module Pages.FormState exposing (Event(..), FieldEvent, FieldState, FormState, PageFormState, init, listeners, setField, setSubmitAttempted, update)
|
|
2
|
+
|
|
3
|
+
{-|
|
|
4
|
+
|
|
5
|
+
@docs Event, FieldEvent, FieldState, FormState, PageFormState, init, listeners, setField, setSubmitAttempted, update
|
|
6
|
+
|
|
7
|
+
-}
|
|
8
|
+
|
|
9
|
+
import Dict exposing (Dict)
|
|
10
|
+
import Form.FieldStatus as FieldStatus exposing (FieldStatus)
|
|
11
|
+
import Html exposing (Attribute)
|
|
12
|
+
import Html.Attributes as Attr
|
|
13
|
+
import Html.Events
|
|
14
|
+
import Json.Decode as Decode exposing (Decoder)
|
|
15
|
+
import Pages.Msg
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
{-| -}
|
|
19
|
+
listeners : String -> List (Attribute (Pages.Msg.Msg userMsg))
|
|
20
|
+
listeners formId =
|
|
21
|
+
[ Html.Events.on "focusin" (Decode.value |> Decode.map Pages.Msg.FormFieldEvent)
|
|
22
|
+
, Html.Events.on "focusout" (Decode.value |> Decode.map Pages.Msg.FormFieldEvent)
|
|
23
|
+
, Html.Events.on "input" (Decode.value |> Decode.map Pages.Msg.FormFieldEvent)
|
|
24
|
+
, Attr.id formId
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
{-| -}
|
|
29
|
+
type Event
|
|
30
|
+
= InputEvent String
|
|
31
|
+
| FocusEvent
|
|
32
|
+
--| ChangeEvent
|
|
33
|
+
| BlurEvent
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
{-| -}
|
|
37
|
+
type alias FieldEvent =
|
|
38
|
+
{ value : String
|
|
39
|
+
, formId : String
|
|
40
|
+
, name : String
|
|
41
|
+
, event : Event
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
{-| -}
|
|
46
|
+
fieldEventDecoder : Decoder FieldEvent
|
|
47
|
+
fieldEventDecoder =
|
|
48
|
+
Decode.map4 FieldEvent
|
|
49
|
+
inputValueDecoder
|
|
50
|
+
(Decode.at [ "currentTarget", "id" ] Decode.string)
|
|
51
|
+
(Decode.at [ "target", "name" ] Decode.string)
|
|
52
|
+
fieldDecoder
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
{-| -}
|
|
56
|
+
inputValueDecoder : Decoder String
|
|
57
|
+
inputValueDecoder =
|
|
58
|
+
Decode.at [ "target", "type" ] Decode.string
|
|
59
|
+
|> Decode.andThen
|
|
60
|
+
(\targetType ->
|
|
61
|
+
case targetType of
|
|
62
|
+
"checkbox" ->
|
|
63
|
+
Decode.map2
|
|
64
|
+
(\valueWhenChecked isChecked ->
|
|
65
|
+
if isChecked then
|
|
66
|
+
valueWhenChecked
|
|
67
|
+
|
|
68
|
+
else
|
|
69
|
+
""
|
|
70
|
+
)
|
|
71
|
+
(Decode.at [ "target", "value" ] Decode.string)
|
|
72
|
+
(Decode.at [ "target", "checked" ] Decode.bool)
|
|
73
|
+
|
|
74
|
+
_ ->
|
|
75
|
+
Decode.at [ "target", "value" ] Decode.string
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
{-| -}
|
|
80
|
+
fieldDecoder : Decoder Event
|
|
81
|
+
fieldDecoder =
|
|
82
|
+
Decode.field "type" Decode.string
|
|
83
|
+
|> Decode.andThen
|
|
84
|
+
(\type_ ->
|
|
85
|
+
case type_ of
|
|
86
|
+
"input" ->
|
|
87
|
+
inputValueDecoder |> Decode.map InputEvent
|
|
88
|
+
|
|
89
|
+
"focusin" ->
|
|
90
|
+
FocusEvent
|
|
91
|
+
|> Decode.succeed
|
|
92
|
+
|
|
93
|
+
"focusout" ->
|
|
94
|
+
BlurEvent
|
|
95
|
+
|> Decode.succeed
|
|
96
|
+
|
|
97
|
+
_ ->
|
|
98
|
+
Decode.fail "Unexpected event.type"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
{-| -}
|
|
103
|
+
update : Decode.Value -> PageFormState -> PageFormState
|
|
104
|
+
update eventObject pageFormState =
|
|
105
|
+
--if Dict.isEmpty pageFormState then
|
|
106
|
+
-- -- TODO get all initial field values
|
|
107
|
+
-- pageFormState
|
|
108
|
+
--
|
|
109
|
+
--else
|
|
110
|
+
case eventObject |> Decode.decodeValue fieldEventDecoder of
|
|
111
|
+
Ok fieldEvent ->
|
|
112
|
+
pageFormState
|
|
113
|
+
|> Dict.update fieldEvent.formId
|
|
114
|
+
(\previousValue_ ->
|
|
115
|
+
let
|
|
116
|
+
previousValue : FormState
|
|
117
|
+
previousValue =
|
|
118
|
+
previousValue_
|
|
119
|
+
|> Maybe.withDefault init
|
|
120
|
+
in
|
|
121
|
+
previousValue
|
|
122
|
+
|> updateForm fieldEvent
|
|
123
|
+
|> Just
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
Err _ ->
|
|
127
|
+
pageFormState
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
{-| -}
|
|
131
|
+
setField : { formId : String, name : String, value : String } -> PageFormState -> PageFormState
|
|
132
|
+
setField info pageFormState =
|
|
133
|
+
pageFormState
|
|
134
|
+
|> Dict.update info.formId
|
|
135
|
+
(\previousValue_ ->
|
|
136
|
+
let
|
|
137
|
+
previousValue : FormState
|
|
138
|
+
previousValue =
|
|
139
|
+
previousValue_
|
|
140
|
+
|> Maybe.withDefault init
|
|
141
|
+
in
|
|
142
|
+
{ previousValue
|
|
143
|
+
| fields =
|
|
144
|
+
previousValue.fields
|
|
145
|
+
|> Dict.update info.name
|
|
146
|
+
(\previousFieldValue_ ->
|
|
147
|
+
let
|
|
148
|
+
previousFieldValue : FieldState
|
|
149
|
+
previousFieldValue =
|
|
150
|
+
previousFieldValue_
|
|
151
|
+
|> Maybe.withDefault { value = "", status = FieldStatus.NotVisited }
|
|
152
|
+
in
|
|
153
|
+
{ previousFieldValue | value = info.value }
|
|
154
|
+
|> Just
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
|> Just
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
{-| -}
|
|
162
|
+
updateForm : FieldEvent -> FormState -> FormState
|
|
163
|
+
updateForm fieldEvent formState =
|
|
164
|
+
{ formState
|
|
165
|
+
| fields =
|
|
166
|
+
formState.fields
|
|
167
|
+
|> Dict.update fieldEvent.name
|
|
168
|
+
(\previousValue_ ->
|
|
169
|
+
let
|
|
170
|
+
previousValue : FieldState
|
|
171
|
+
previousValue =
|
|
172
|
+
previousValue_
|
|
173
|
+
|> Maybe.withDefault { value = fieldEvent.value, status = FieldStatus.NotVisited }
|
|
174
|
+
in
|
|
175
|
+
(case fieldEvent.event of
|
|
176
|
+
InputEvent newValue ->
|
|
177
|
+
{ previousValue | value = newValue }
|
|
178
|
+
|
|
179
|
+
FocusEvent ->
|
|
180
|
+
{ previousValue | status = previousValue.status |> increaseStatusTo FieldStatus.Focused }
|
|
181
|
+
|
|
182
|
+
BlurEvent ->
|
|
183
|
+
{ previousValue | status = previousValue.status |> increaseStatusTo FieldStatus.Blurred }
|
|
184
|
+
)
|
|
185
|
+
|> Just
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
{-| -}
|
|
191
|
+
setSubmitAttempted : String -> PageFormState -> PageFormState
|
|
192
|
+
setSubmitAttempted fieldId pageFormState =
|
|
193
|
+
pageFormState
|
|
194
|
+
|> Dict.update fieldId
|
|
195
|
+
(\maybeForm ->
|
|
196
|
+
case maybeForm of
|
|
197
|
+
Just formState ->
|
|
198
|
+
Just { formState | submitAttempted = True }
|
|
199
|
+
|
|
200
|
+
Nothing ->
|
|
201
|
+
Just { init | submitAttempted = True }
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
{-| -}
|
|
206
|
+
init : FormState
|
|
207
|
+
init =
|
|
208
|
+
{ fields = Dict.empty
|
|
209
|
+
, submitAttempted = False
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
{-| -}
|
|
214
|
+
type alias PageFormState =
|
|
215
|
+
Dict String FormState
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
{-| -}
|
|
219
|
+
type alias FormState =
|
|
220
|
+
{ fields : Dict String FieldState
|
|
221
|
+
, submitAttempted : Bool
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
{-| -}
|
|
226
|
+
type alias FieldState =
|
|
227
|
+
{ value : String
|
|
228
|
+
, status : FieldStatus
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
{-| -}
|
|
233
|
+
increaseStatusTo : FieldStatus -> FieldStatus -> FieldStatus
|
|
234
|
+
increaseStatusTo increaseTo currentStatus =
|
|
235
|
+
if statusRank increaseTo > statusRank currentStatus then
|
|
236
|
+
increaseTo
|
|
237
|
+
|
|
238
|
+
else
|
|
239
|
+
currentStatus
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
{-| -}
|
|
243
|
+
statusRank : FieldStatus -> Int
|
|
244
|
+
statusRank status =
|
|
245
|
+
case status of
|
|
246
|
+
FieldStatus.NotVisited ->
|
|
247
|
+
0
|
|
248
|
+
|
|
249
|
+
FieldStatus.Focused ->
|
|
250
|
+
1
|
|
251
|
+
|
|
252
|
+
FieldStatus.Changed ->
|
|
253
|
+
2
|
|
254
|
+
|
|
255
|
+
FieldStatus.Blurred ->
|
|
256
|
+
3
|