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.
Files changed (75) hide show
  1. package/README.md +2 -26
  2. package/codegen/elm-pages-codegen.cjs +10741 -10302
  3. package/generator/src/build.js +15 -5
  4. package/generator/src/cli.js +3 -5
  5. package/generator/src/compatibility-key.js +2 -2
  6. package/generator/src/dev-server.js +3 -0
  7. package/generator/src/render.js +681 -50
  8. package/generator/src/request-cache.js +13 -6
  9. package/generator/src/spinnies/index.js +200 -0
  10. package/generator/src/spinnies/utils.js +123 -0
  11. package/generator/src/validate-stream.js +25 -0
  12. package/generator/template/elm.json +4 -4
  13. package/generator/template/package.json +6 -6
  14. package/generator/template/script/elm.json +7 -8
  15. package/package.json +4 -3
  16. package/src/BackendTask/Custom.elm +38 -0
  17. package/src/BackendTask/Do.elm +233 -0
  18. package/src/BackendTask/File.elm +24 -9
  19. package/src/BackendTask/Glob.elm +208 -25
  20. package/src/BackendTask/Http.elm +32 -21
  21. package/src/BackendTask/Internal/Glob.elm +16 -4
  22. package/src/BackendTask/Stream.elm +1179 -0
  23. package/src/BackendTask.elm +214 -7
  24. package/src/Pages/Internal/Platform/CompatibilityKey.elm +1 -1
  25. package/src/Pages/Internal/Platform.elm +11 -2
  26. package/src/Pages/Script/Spinner.elm +505 -0
  27. package/src/Pages/Script.elm +199 -2
  28. package/src/Pages/StaticHttp/Request.elm +7 -0
  29. package/src/RequestsAndPending.elm +1 -1
  30. package/src/Scaffold/Form.elm +2 -3
  31. package/src/TerminalText.elm +8 -0
  32. package/src/Vendored/Result/Extra.elm +75 -0
  33. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmi +0 -0
  34. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateData.elmo +0 -0
  35. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmi +0 -0
  36. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-DeadCodeEliminateDataTest.elmo +0 -0
  37. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmi +0 -0
  38. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
  39. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
  40. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -0
  41. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  42. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  43. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock +0 -0
  44. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  45. package/generator/dead-code-review/elm-stuff/tests-0.19.1/elm.json +0 -1
  46. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +0 -7900
  47. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/Runner.elm.js +0 -28657
  48. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_runner.js +0 -110
  49. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/node_supervisor.js +0 -187
  50. package/generator/dead-code-review/elm-stuff/tests-0.19.1/js/package.json +0 -1
  51. package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Reporter.elm +0 -26
  52. package/generator/dead-code-review/elm-stuff/tests-0.19.1/src/Runner.elm +0 -62
  53. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmi +0 -0
  54. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Internal-RoutePattern.elmo +0 -0
  55. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmi +0 -0
  56. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolations.elmo +0 -0
  57. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmi +0 -0
  58. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Pages-Review-NoContractViolationsTest.elmo +0 -0
  59. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmi +0 -0
  60. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Reporter.elmo +0 -0
  61. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmi +0 -0
  62. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/Runner.elmo +0 -0
  63. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/d.dat +0 -0
  64. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/i.dat +0 -0
  65. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/lock +0 -0
  66. package/generator/review/elm-stuff/tests-0.19.1/elm-stuff/0.19.1/o.dat +0 -0
  67. package/generator/review/elm-stuff/tests-0.19.1/elm.json +0 -1
  68. package/generator/review/elm-stuff/tests-0.19.1/js/Reporter.elm.js +0 -7900
  69. package/generator/review/elm-stuff/tests-0.19.1/js/Runner.elm.js +0 -30511
  70. package/generator/review/elm-stuff/tests-0.19.1/js/node_runner.js +0 -110
  71. package/generator/review/elm-stuff/tests-0.19.1/js/node_supervisor.js +0 -187
  72. package/generator/review/elm-stuff/tests-0.19.1/js/package.json +0 -1
  73. package/generator/review/elm-stuff/tests-0.19.1/src/Reporter.elm +0 -26
  74. package/generator/review/elm-stuff/tests-0.19.1/src/Runner.elm +0 -62
  75. package/src/Result/Extra.elm +0 -26
@@ -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 Json.Decode as Decode exposing (Decoder)
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 exposing (Decoder)
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 exposing (Decoder)
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 = { name : String }
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 ()
@@ -3,4 +3,4 @@ module Pages.Internal.Platform.CompatibilityKey exposing (currentCompatibilityKe
3
3
 
4
4
  currentCompatibilityKey : Int
5
5
  currentCompatibilityKey =
6
- 21
6
+ 22
@@ -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
- ( model, NoEffect )
506
- |> startNewGetLoad (currentUrlWithPath redirectTo model) toMsg
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)