git.iko.soy/rowtype-yoga/purescript-fetch
on main help sign in
Update for js-promise migration
commitf8b85155624008f933c44e6aeadfda9cc5a81ea6 authorThomas Honeyman <hello@thomashoneyman.com> dateFri 4 Aug 2023, 12:31 (3 years ago) parentd7b1b93
6 files changed+61−90
bower.json+22−31 packages.dhall+26−30 spago.dhall+1−3 src/Fetch.purs+7−7 src/Fetch/Internal/Response.purs+5−12 test.dhall−7
bower.json+22−31
@@ -1,33 +1,24 @@
11{
2− "name": "purescript-fetch",
3− "license": [
4− "MIT"
5− ],
6− "repository": {
7− "type": "git",
8− "url": "https://github.com/rowtype-yoga/purescript-fetch.git"
9− },
10− "ignore": [
11− "**/.*",
12− "node_modules",
13− "bower_components",
14− "output"
15− ],
16− "dependencies": {
17− "purescript-aff": "^v7.0.0",
18− "purescript-aff-promise": "^v4.0.0",
19− "purescript-arraybuffer-types": "^v3.0.2",
20− "purescript-effect": "^v4.0.0",
21− "purescript-fetch-core": "https://github.com/rowtype-yoga/purescript-fetch-core.git#v4.0.4",
22− "purescript-foreign": "^v7.0.0",
23− "purescript-http-methods": "^v6.0.0",
24− "purescript-newtype": "^v5.0.0",
25− "purescript-prelude": "^v6.0.0",
26− "purescript-record": "^v4.0.0",
27− "purescript-typelevel-prelude": "^v7.0.0",
28− "purescript-unsafe-coerce": "^v6.0.0",
29− "purescript-web-file": "^v4.0.0",
30− "purescript-web-promise": "https://github.com/purescript-web/purescript-web-promise.git#v3.0.0",
31− "purescript-web-streams": "https://github.com/purescript-web/purescript-web-streams.git#v3.0.0"
32− }
2+ "name": "purescript-fetch",
3+ "license": ["MIT"],
4+ "repository": {
5+ "type": "git",
6+ "url": "https://github.com/rowtype-yoga/purescript-fetch.git"
7+ },
8+ "ignore": ["**/.*", "node_modules", "bower_components", "output"],
9+ "dependencies": {
10+ "purescript-aff": "^v7.0.0",
11+ "purescript-arraybuffer-types": "^v3.0.2",
12+ "purescript-effect": "^v4.0.0",
13+ "purescript-fetch-core": "https://github.com/thomashoneyman/purescript-fetch-core.git#main",
14+ "purescript-foreign": "^v7.0.0",
15+ "purescript-http-methods": "^v6.0.0",
16+ "purescript-js-promise-aff": "https://github.com/purescript-contrib/purescript-js-promise-aff.git#^v1.0.0",
17+ "purescript-newtype": "^v5.0.0",
18+ "purescript-prelude": "^v6.0.0",
19+ "purescript-record": "^v4.0.0",
20+ "purescript-typelevel-prelude": "^v7.0.0",
21+ "purescript-web-file": "^v4.0.0",
22+ "purescript-web-streams": "https://github.com/purescript-web/purescript-web-streams.git#^v4.0.0"
23+ }
3324}
packages.dhall+26−30
@@ -1,33 +1,29 @@
1−
21let upstream =
3− https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20220816/packages.dhall
4− sha256:8b4467b4b5041914f9b765779c8936d6d4c230b1f60eb64f6269c71812fd7e98
2+ https://github.com/purescript/package-sets/releases/download/psc-0.15.10-20230803/packages.dhall
3+ sha256:7da82e40277c398fd70f16af6450fb74287a88e2a3c8885c065dcdb9df893761
54
65in upstream
7− with fetch-core = {
8− dependencies = [
9− "arraybuffer-types"
10− , "arrays"
11− , "console"
12− , "effect"
13− , "foldable-traversable"
14− , "foreign"
15− , "foreign-object"
16− , "functions"
17− , "http-methods"
18− , "maybe"
19− , "newtype"
20− , "nullable"
21− , "prelude"
22− , "record"
23− , "tuples"
24− , "typelevel-prelude"
25− , "unfoldable"
26− , "unsafe-coerce"
27− , "web-file"
28− , "web-promise"
29− , "web-streams"
30− ],
31− version = "v4.0.4",
32− repo = "https://github.com/rowtype-yoga/purescript-fetch-core.git"
33− }
6+ with fetch-core =
7+ { dependencies =
8+ [ "arraybuffer-types"
9+ , "arrays"
10+ , "effect"
11+ , "foldable-traversable"
12+ , "foreign"
13+ , "foreign-object"
14+ , "functions"
15+ , "http-methods"
16+ , "js-promise"
17+ , "maybe"
18+ , "newtype"
19+ , "prelude"
20+ , "record"
21+ , "tuples"
22+ , "typelevel-prelude"
23+ , "unfoldable"
24+ , "web-file"
25+ , "web-streams"
26+ ]
27+ , version = "main"
28+ , repo = "https://github.com/thomashoneyman/purescript-fetch-core.git"
29+ }
spago.dhall+1−3
@@ -1,13 +1,13 @@
11{ name = "fetch"
22, dependencies =
33 [ "aff"
4− , "aff-promise"
54 , "arraybuffer-types"
65 , "bifunctors"
76 , "effect"
87 , "fetch-core"
98 , "foreign"
109 , "http-methods"
10+ , "js-promise-aff"
1111 , "maybe"
1212 , "newtype"
1313 , "ordered-collections"
@@ -15,9 +15,7 @@
1515 , "record"
1616 , "strings"
1717 , "typelevel-prelude"
18− , "unsafe-coerce"
1918 , "web-file"
20− , "web-promise"
2119 , "web-streams"
2220 ]
2321, packages = ./packages.dhall
src/Fetch.purs+7−7
@@ -15,7 +15,6 @@ module Fetch
1515
1616import Prelude
1717
18−import Control.Promise as Promise
1918import Data.HTTP.Method (Method(..))
2019import Effect.Aff (Aff)
2120import Effect.Class (liftEffect)
@@ -26,20 +25,21 @@ import Fetch.Core.Request as CoreRequest
2625import Fetch.Core.RequestCache (RequestCache(..))
2726import Fetch.Core.RequestCredentials (RequestCredentials(Omit, Include))
2827import Fetch.Core.RequestMode (RequestMode(Cors, NoCors, Navigate))
28+import Fetch.Internal.Headers (lookup, toHeaders, contains)
2929import Fetch.Internal.Request (class ToCoreRequestOptions, class ToCoreRequestOptionsConverter, class ToCoreRequestOptionsHelper, HighlevelRequestOptions, convertHelper, convertImpl, new)
3030import Fetch.Internal.Request as Request
31−import Fetch.Internal.Headers (lookup, toHeaders, contains)
3231import Fetch.Internal.RequestBody (class ToRequestBody, toRequestBody)
33−import Fetch.Internal.Response (Response, ResponseR, arrayBuffer, blob, body, json, promiseToPromise, text)
32+import Fetch.Internal.Response (Response, ResponseR, arrayBuffer, blob, body, json, text)
3433import Fetch.Internal.Response as Response
3534import Prim.Row (class Union)
35+import Promise.Aff as Promise.Aff
3636
3737-- | Implementation of `fetch`, see https://developer.mozilla.org/en-US/docs/Web/API/fetch
3838-- | For usage with `String` bodies. For other body types, see `fetchBody`
39−-- |
39+-- |
4040-- | Usage:
4141-- | ```purescript
42−-- | do
42+-- | do
4343-- | let requestUrl = "https://httpbin.org/get"
4444-- | { status, text } <- fetch requestUrl { headers: { "Accept": "application/json" }}
4545-- | responseBody <- text
@@ -66,7 +66,7 @@ fetch
6666 -> Aff Response
6767fetch url r = do
6868 request <- liftEffect $ new url $ Request.convert r
69− cResponse <- Promise.toAffE $ Response.promiseToPromise <$> Core.fetch request
69+ cResponse <- Promise.Aff.toAffE $ Core.fetch request
7070 pure $ Response.convert cResponse
7171
7272-- | Like `fetch`, but can accept arbitrary `RequestBody`s.
@@ -81,5 +81,5 @@ fetchBody
8181 -> Aff Response
8282fetchBody url r = do
8383 request <- liftEffect $ new url $ Request.convert r
84− cResponse <- Promise.toAffE $ Response.promiseToPromise <$> Core.fetch request
84+ cResponse <- Promise.Aff.toAffE $ Core.fetch request
8585 pure $ Response.convert cResponse
src/Fetch/Internal/Response.purs+5−12
@@ -6,14 +6,11 @@ module Fetch.Internal.Response
66 , body
77 , convert
88 , json
9− , promiseToPromise
109 , text
1110 ) where
1211
1312import Prelude
1413
15−import Control.Promise as Control
16−import Control.Promise as Promise
1714import Data.ArrayBuffer.Types (ArrayBuffer, Uint8Array)
1815import Data.Map as Map
1916import Data.String.CaseInsensitive (CaseInsensitiveString)
@@ -22,9 +19,8 @@ import Effect.Aff (Aff)
2219import Fetch.Core.Response as CoreResponse
2320import Fetch.Internal.Headers (toHeaders)
2421import Foreign (Foreign)
25−import Unsafe.Coerce (unsafeCoerce)
22+import Promise.Aff as Promise.Aff
2623import Web.File.Blob (Blob)
27−import Web.Promise as Web
2824import Web.Streams.ReadableStream (ReadableStream)
2925
3026type ResponseR =
@@ -46,22 +42,19 @@ type Response =
4642 }
4743
4844text :: CoreResponse.Response -> Aff String
49−text response = CoreResponse.text response <#> promiseToPromise # Promise.toAffE
45+text response = CoreResponse.text response # Promise.Aff.toAffE
5046
5147body :: CoreResponse.Response -> Effect (ReadableStream Uint8Array)
5248body = CoreResponse.body
5349
5450json :: CoreResponse.Response -> Aff Foreign
55−json response = CoreResponse.json response <#> promiseToPromise # Promise.toAffE
51+json response = CoreResponse.json response # Promise.Aff.toAffE
5652
5753arrayBuffer :: CoreResponse.Response -> Aff ArrayBuffer
58−arrayBuffer response = CoreResponse.arrayBuffer response <#> promiseToPromise # Promise.toAffE
54+arrayBuffer response = CoreResponse.arrayBuffer response # Promise.Aff.toAffE
5955
6056blob :: CoreResponse.Response -> Aff Blob
61−blob response = CoreResponse.blob response <#> promiseToPromise # Promise.toAffE
62−
63−promiseToPromise :: Web.Promise ~> Control.Promise
64−promiseToPromise = unsafeCoerce
57+blob response = CoreResponse.blob response # Promise.Aff.toAffE
6558
6659convert :: CoreResponse.Response -> Response
6760convert response =
test.dhall−7
@@ -5,17 +5,10 @@ in conf
55 , dependencies =
66 conf.dependencies
77 # [ "aff"
8− , "aff-promise"
9− , "console"
108 , "effect"
11− , "either"
12− , "exceptions"
13− , "lists"
149 , "spec"
1510 , "spec-discovery"
1611 , "strings"
17− , "transformers"
1812 , "debug"
19− , "media-types"
2013 ]
2114 }