elm-pages 3.0.12 → 3.0.14
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 +2 -26
- package/codegen/elm-pages-codegen.cjs +10741 -10302
- package/generator/src/build.js +15 -5
- package/generator/src/cli.js +3 -5
- package/generator/src/compatibility-key.js +2 -2
- package/generator/src/dev-server.js +3 -0
- package/generator/src/render.js +681 -50
- package/generator/src/request-cache.js +13 -6
- package/generator/src/spinnies/index.js +200 -0
- package/generator/src/spinnies/utils.js +123 -0
- package/generator/src/validate-stream.js +25 -0
- package/generator/template/elm.json +4 -4
- package/generator/template/package.json +6 -6
- package/generator/template/script/elm.json +7 -8
- package/package.json +4 -3
- package/src/BackendTask/Custom.elm +38 -0
- package/src/BackendTask/Do.elm +233 -0
- package/src/BackendTask/File.elm +24 -9
- package/src/BackendTask/Glob.elm +208 -25
- package/src/BackendTask/Http.elm +32 -21
- package/src/BackendTask/Internal/Glob.elm +16 -4
- package/src/BackendTask/Stream.elm +1179 -0
- package/src/BackendTask.elm +214 -7
- package/src/Pages/Internal/Platform/CompatibilityKey.elm +1 -1
- package/src/Pages/Internal/Platform.elm +11 -2
- package/src/Pages/Script/Spinner.elm +505 -0
- package/src/Pages/Script.elm +199 -2
- package/src/Pages/StaticHttp/Request.elm +7 -0
- package/src/RequestsAndPending.elm +1 -1
- package/src/Scaffold/Form.elm +2 -3
- package/src/TerminalText.elm +8 -0
- package/src/Vendored/Result/Extra.elm +75 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +0 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +0 -7900
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +0 -28657
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +0 -110
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +0 -187
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/package.json +0 -1
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Reporter.elm +0 -26
- package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Runner.elm +0 -62
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
- package/generator/review/elm-stuff/tests-0.19.1/elm.json +0 -1
- package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +0 -7900
- package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +0 -30511
- package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +0 -110
- package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +0 -187
- package/generator/review/elm-stuff/tests-0.19.1/js/package.json +0 -1
- package/generator/review/elm-stuff/tests-0.19.1/src/Reporter.elm +0 -26
- package/generator/review/elm-stuff/tests-0.19.1/src/Runner.elm +0 -62
- package/src/Result/Extra.elm +0 -26
package/src/BackendTask.elm
CHANGED
|
@@ -6,6 +6,8 @@ module BackendTask exposing
|
|
|
6
6
|
, andMap
|
|
7
7
|
, map2, map3, map4, map5, map6, map7, map8, map9
|
|
8
8
|
, allowFatal, mapError, onError, toResult
|
|
9
|
+
, do, doEach, sequence, failIf
|
|
10
|
+
, inDir, quiet, withEnv
|
|
9
11
|
)
|
|
10
12
|
|
|
11
13
|
{-| In an `elm-pages` app, each Route Module can define a value `data` which is a `BackendTask` that will be resolved **before** `init` is called. That means it is also available
|
|
@@ -84,8 +86,29 @@ Any place in your `elm-pages` app where the framework lets you pass in a value o
|
|
|
84
86
|
|
|
85
87
|
@docs allowFatal, mapError, onError, toResult
|
|
86
88
|
|
|
89
|
+
|
|
90
|
+
## Scripting
|
|
91
|
+
|
|
92
|
+
@docs do, doEach, sequence, failIf
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
## BackendTask Context
|
|
96
|
+
|
|
97
|
+
You can set the following context for a `BackendTask`:
|
|
98
|
+
|
|
99
|
+
- `inDir` - Set the working directory
|
|
100
|
+
- `quiet` - Silence the output
|
|
101
|
+
- `withEnv` - Set an environment variable
|
|
102
|
+
|
|
103
|
+
It's important to understand that a `BackendTask` does not run until it is passed to the `elm-pages` runtime (it is _not_ run as soon as it is defined,
|
|
104
|
+
like you may be familiar with in other languages like JavaScript). So you can use these functions to set the context
|
|
105
|
+
of a `BackendTask` at any point before you pass it to and it will be applied when the `BackendTask` is run.
|
|
106
|
+
|
|
107
|
+
@docs inDir, quiet, withEnv
|
|
108
|
+
|
|
87
109
|
-}
|
|
88
110
|
|
|
111
|
+
import Dict
|
|
89
112
|
import FatalError exposing (FatalError)
|
|
90
113
|
import Json.Encode
|
|
91
114
|
import List.Chunks
|
|
@@ -102,16 +125,19 @@ type alias BackendTask error value =
|
|
|
102
125
|
{-| Transform a request into an arbitrary value. The same underlying task will be performed,
|
|
103
126
|
but mapping allows you to change the resulting values by applying functions to the results.
|
|
104
127
|
|
|
105
|
-
import BackendTask
|
|
128
|
+
import BackendTask exposing (BackendTask)
|
|
106
129
|
import BackendTask.Http
|
|
107
|
-
import
|
|
130
|
+
import FatalError exposing (FatalError)
|
|
131
|
+
import Json.Decode as Decode
|
|
108
132
|
|
|
133
|
+
starsMessage : BackendTask FatalError String
|
|
109
134
|
starsMessage =
|
|
110
135
|
BackendTask.Http.getJson
|
|
111
136
|
"https://api.github.com/repos/dillonkearns/elm-pages"
|
|
112
137
|
(Decode.field "stargazers_count" Decode.int)
|
|
113
138
|
|> BackendTask.map
|
|
114
139
|
(\stars -> "⭐️ " ++ String.fromInt stars)
|
|
140
|
+
|> BackendTask.allowFatal
|
|
115
141
|
|
|
116
142
|
-}
|
|
117
143
|
map : (a -> b) -> BackendTask error a -> BackendTask error b
|
|
@@ -126,6 +152,125 @@ map fn requestInfo =
|
|
|
126
152
|
(mapLookupFn fn lookupFn)
|
|
127
153
|
|
|
128
154
|
|
|
155
|
+
{-| `inDir` sets the working directory for a `BackendTask`. The working directory of a `BackendTask` will be used to resolve relative paths
|
|
156
|
+
and is relevant for the following types of `BackendTask`s:
|
|
157
|
+
|
|
158
|
+
- Reading files ([`BackendTask.File`](BackendTask-File))
|
|
159
|
+
- Running glob patterns ([`BackendTask.Glob`](BackendTask-Glob))
|
|
160
|
+
- Executing shell commands ([`BackendTask.Stream.command`](BackendTask-Stream#command)) and [`Pages.Script.sh`](Pages-Script#command)
|
|
161
|
+
|
|
162
|
+
See the BackendTask Context section for more about how setting context works.
|
|
163
|
+
|
|
164
|
+
For example, these two values will produce the same result:
|
|
165
|
+
|
|
166
|
+
import BackendTask.Glob as Glob
|
|
167
|
+
|
|
168
|
+
example1 : BackendTask error (List String)
|
|
169
|
+
example1 =
|
|
170
|
+
Glob.fromString "src/**/*.elm"
|
|
171
|
+
|
|
172
|
+
example2 : BackendTask error (List String)
|
|
173
|
+
example2 =
|
|
174
|
+
BackendTask.inDir "src" (Glob.fromString "**/*.elm")
|
|
175
|
+
|
|
176
|
+
You can also nest the working directory by using `inDir` multiple times:
|
|
177
|
+
|
|
178
|
+
import BackendTask.Glob as Glob
|
|
179
|
+
|
|
180
|
+
example3 : BackendTask error (List String)
|
|
181
|
+
example3 =
|
|
182
|
+
BackendTask.map2
|
|
183
|
+
(\routeModules specialModules ->
|
|
184
|
+
{ routeModules = routeModules
|
|
185
|
+
, specialModules = specialModules
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
(BackendTask.inDir "Route" (Glob.fromString "**/*.elm"))
|
|
189
|
+
(Glob.fromString "*.elm")
|
|
190
|
+
|> BackendTask.inDir "app"
|
|
191
|
+
|
|
192
|
+
The above example will list out files from `app/Route/**/*.elm` and `app/*.elm` because `inDir "app"` is applied to the `BackendTask.map2` which combines together both of the Glob tasks.
|
|
193
|
+
|
|
194
|
+
`inDir` supports absolute paths. In this example, we apply a relative path on top of an absolute path, so the relative path will be resolved relative to the absolute path.
|
|
195
|
+
|
|
196
|
+
import BackendTask.Glob as Glob
|
|
197
|
+
|
|
198
|
+
example3 : BackendTask error (List String)
|
|
199
|
+
example3 =
|
|
200
|
+
BackendTask.map2
|
|
201
|
+
(\routeModules specialModules ->
|
|
202
|
+
{ routeModules = routeModules
|
|
203
|
+
, specialModules = specialModules
|
|
204
|
+
}
|
|
205
|
+
)
|
|
206
|
+
-- same as `Glob.fromString "/projects/my-elm-pages-blog/app/Route/**/*.elm"`
|
|
207
|
+
(BackendTask.inDir "Route" (Glob.fromString "**/*.elm"))
|
|
208
|
+
(Glob.fromString "*.elm")
|
|
209
|
+
|> BackendTask.inDir "/projects/my-elm-pages-blog/app"
|
|
210
|
+
|
|
211
|
+
You can also use `BackendTask.inDir ".."` to go up a directory, or \`BackendTask.inDir "../.." to go up two directories, etc.
|
|
212
|
+
|
|
213
|
+
Use of trailing slashes is optional and does not change the behavior of `inDir`. Leading slashes distinguish between
|
|
214
|
+
absolute and relative paths, so `BackendTask.inDir "./src"` is exactly the same as `BackendTask.inDir "src"`, etc.
|
|
215
|
+
|
|
216
|
+
Each level of nesting with `inDir` will resolve using [NodeJS's `path.resolve`](https://nodejs.org/api/path.html#pathresolvepaths).
|
|
217
|
+
|
|
218
|
+
-}
|
|
219
|
+
inDir : String -> BackendTask error value -> BackendTask error value
|
|
220
|
+
inDir dir backendTask =
|
|
221
|
+
-- elm-review: known-unoptimized-recursion
|
|
222
|
+
-- TODO try to find a way to optimize tail-call recursion here
|
|
223
|
+
case backendTask of
|
|
224
|
+
ApiRoute _ ->
|
|
225
|
+
backendTask
|
|
226
|
+
|
|
227
|
+
Request urls lookupFn ->
|
|
228
|
+
Request
|
|
229
|
+
(urls
|
|
230
|
+
|> List.map (\req -> { req | dir = dir :: req.dir })
|
|
231
|
+
)
|
|
232
|
+
(\a b -> lookupFn a b |> inDir dir)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
{-| Sets the verbosity level to `quiet` in the context of the given `BackendTask` (including all nested `BackendTask`s and continuations within it).
|
|
236
|
+
|
|
237
|
+
This will turn off performance timing logs. It will also prevent shell commands from printing their output to the console when they are run
|
|
238
|
+
(see [`BackendTask.Stream.command`](BackendTask-Stream#command)).
|
|
239
|
+
|
|
240
|
+
-}
|
|
241
|
+
quiet : BackendTask error value -> BackendTask error value
|
|
242
|
+
quiet backendTask =
|
|
243
|
+
-- elm-review: known-unoptimized-recursion
|
|
244
|
+
-- TODO try to find a way to optimize tail-call recursion here
|
|
245
|
+
case backendTask of
|
|
246
|
+
ApiRoute _ ->
|
|
247
|
+
backendTask
|
|
248
|
+
|
|
249
|
+
Request urls lookupFn ->
|
|
250
|
+
Request
|
|
251
|
+
(urls
|
|
252
|
+
|> List.map (\req -> { req | quiet = True })
|
|
253
|
+
)
|
|
254
|
+
(\a b -> lookupFn a b |> quiet)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
{-| -}
|
|
258
|
+
withEnv : String -> String -> BackendTask error value -> BackendTask error value
|
|
259
|
+
withEnv key value backendTask =
|
|
260
|
+
-- elm-review: known-unoptimized-recursion
|
|
261
|
+
-- TODO try to find a way to optimize tail-call recursion here
|
|
262
|
+
case backendTask of
|
|
263
|
+
ApiRoute _ ->
|
|
264
|
+
backendTask
|
|
265
|
+
|
|
266
|
+
Request urls lookupFn ->
|
|
267
|
+
Request
|
|
268
|
+
(urls
|
|
269
|
+
|> List.map (\req -> { req | env = req.env |> Dict.insert key value })
|
|
270
|
+
)
|
|
271
|
+
(\a b -> lookupFn a b |> withEnv key value)
|
|
272
|
+
|
|
273
|
+
|
|
129
274
|
mapLookupFn : (a -> b) -> (d -> c -> BackendTask error a) -> d -> c -> BackendTask error b
|
|
130
275
|
mapLookupFn fn lookupFn maybeMock requests =
|
|
131
276
|
map fn (lookupFn maybeMock requests)
|
|
@@ -140,9 +285,10 @@ resolve =
|
|
|
140
285
|
|
|
141
286
|
{-| Turn a list of `BackendTask`s into a single one.
|
|
142
287
|
|
|
143
|
-
import BackendTask
|
|
288
|
+
import BackendTask exposing (BackendTask)
|
|
289
|
+
import BackendTask.Http
|
|
144
290
|
import FatalError exposing (FatalError)
|
|
145
|
-
import Json.Decode as Decode
|
|
291
|
+
import Json.Decode as Decode
|
|
146
292
|
|
|
147
293
|
type alias Pokemon =
|
|
148
294
|
{ name : String
|
|
@@ -199,6 +345,54 @@ combineHelp items =
|
|
|
199
345
|
List.foldl (map2 (::)) (succeed []) items |> map List.reverse
|
|
200
346
|
|
|
201
347
|
|
|
348
|
+
{-| Perform a List of `BackendTask`s with no output, one-by-one sequentially.
|
|
349
|
+
|
|
350
|
+
Same as [`sequence`](#sequence), except it ignores the resulting value of each `BackendTask`.
|
|
351
|
+
|
|
352
|
+
-}
|
|
353
|
+
doEach : List (BackendTask error ()) -> BackendTask error ()
|
|
354
|
+
doEach items =
|
|
355
|
+
items
|
|
356
|
+
|> sequenceHelp
|
|
357
|
+
|> map (\_ -> ())
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
{-| Ignore the resulting value of the BackendTask.
|
|
361
|
+
-}
|
|
362
|
+
do : BackendTask error value -> BackendTask error ()
|
|
363
|
+
do backendTask =
|
|
364
|
+
backendTask
|
|
365
|
+
|> map (\_ -> ())
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
{-| Perform a List of `BackendTask`s one-by-one sequentially. [`combine`](#combine) will perform them all in parallel, which is
|
|
369
|
+
typically a better default when you aren't sure which you want.
|
|
370
|
+
|
|
371
|
+
Same as [`doEach`](#doEach), except it ignores the resulting value of each `BackendTask`.
|
|
372
|
+
|
|
373
|
+
-}
|
|
374
|
+
sequence : List (BackendTask error value) -> BackendTask error (List value)
|
|
375
|
+
sequence items =
|
|
376
|
+
items
|
|
377
|
+
|> sequenceHelp
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
sequenceHelp : List (BackendTask error value) -> BackendTask error (List value)
|
|
381
|
+
sequenceHelp items =
|
|
382
|
+
List.foldl
|
|
383
|
+
(\item accumulator ->
|
|
384
|
+
accumulator
|
|
385
|
+
|> andThen
|
|
386
|
+
(\accValue ->
|
|
387
|
+
item
|
|
388
|
+
|> map (\itemValue -> itemValue :: accValue)
|
|
389
|
+
)
|
|
390
|
+
)
|
|
391
|
+
(succeed [])
|
|
392
|
+
items
|
|
393
|
+
|> map List.reverse
|
|
394
|
+
|
|
395
|
+
|
|
202
396
|
{-| Like map, but it takes in two `BackendTask`s.
|
|
203
397
|
|
|
204
398
|
import BackendTask exposing (BackendTask)
|
|
@@ -262,9 +456,10 @@ map2 fn request1 request2 =
|
|
|
262
456
|
{-| Build off of the response from a previous `BackendTask` request to build a follow-up request. You can use the data
|
|
263
457
|
from the previous response to build up the URL, headers, etc. that you send to the subsequent request.
|
|
264
458
|
|
|
265
|
-
import BackendTask
|
|
459
|
+
import BackendTask exposing (BackendTask)
|
|
460
|
+
import BackendTask.Http
|
|
266
461
|
import FatalError exposing (FatalError)
|
|
267
|
-
import Json.Decode as Decode
|
|
462
|
+
import Json.Decode as Decode
|
|
268
463
|
|
|
269
464
|
licenseData : BackendTask FatalError String
|
|
270
465
|
licenseData =
|
|
@@ -339,7 +534,8 @@ andMap =
|
|
|
339
534
|
|
|
340
535
|
import BackendTask exposing (BackendTask)
|
|
341
536
|
|
|
342
|
-
type alias RouteParams =
|
|
537
|
+
type alias RouteParams =
|
|
538
|
+
{ name : String }
|
|
343
539
|
|
|
344
540
|
pages : BackendTask error (List RouteParams)
|
|
345
541
|
pages =
|
|
@@ -542,3 +738,14 @@ toResult backendTask =
|
|
|
542
738
|
backendTask
|
|
543
739
|
|> andThen (Ok >> succeed)
|
|
544
740
|
|> onError (Err >> succeed)
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
{-| If the condition is true, fail with the given `FatalError`. Otherwise, succeed with `()`.
|
|
744
|
+
-}
|
|
745
|
+
failIf : Bool -> FatalError -> BackendTask FatalError ()
|
|
746
|
+
failIf condition fatalError =
|
|
747
|
+
if condition then
|
|
748
|
+
fail fatalError
|
|
749
|
+
|
|
750
|
+
else
|
|
751
|
+
succeed ()
|
|
@@ -502,8 +502,17 @@ update config appMsg model =
|
|
|
502
502
|
ProcessFetchResponse transitionId response toMsg ->
|
|
503
503
|
case response of
|
|
504
504
|
Ok ( _, ResponseSketch.Redirect redirectTo ) ->
|
|
505
|
-
|
|
506
|
-
|
|
505
|
+
let
|
|
506
|
+
isAbsoluteUrl : Bool
|
|
507
|
+
isAbsoluteUrl =
|
|
508
|
+
Url.fromString redirectTo /= Nothing
|
|
509
|
+
in
|
|
510
|
+
if isAbsoluteUrl then
|
|
511
|
+
( model, BrowserLoadUrl redirectTo )
|
|
512
|
+
|
|
513
|
+
else
|
|
514
|
+
( model, NoEffect )
|
|
515
|
+
|> startNewGetLoad (currentUrlWithPath redirectTo model) toMsg
|
|
507
516
|
|
|
508
517
|
_ ->
|
|
509
518
|
update config (toMsg response) (clearLoadingFetchersAfterDataLoad transitionId model)
|