Skip to content

Commit b9d3333

Browse files
authored
fix: Node.URL.URLSearchParams keys & values return undefined (#22)
* fix: Node.URL.URLSearchParams keys & values return undefined * docs: update changelog * test: add tests * test: formatting * chore: fmt * chore: add npm fmt script --------- Co-authored-by: Orion Kindel <[email protected]>
1 parent 9c5a840 commit b9d3333

File tree

5 files changed

+54
-8
lines changed

5 files changed

+54
-8
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Breaking changes:
99
New features:
1010

1111
Bugfixes:
12+
- `URLSearchParams.keys` and `.values` returned undefined due to a bug in the foreign code (#22 by @cakekindel)
1213

1314
Other improvements:
1415
- Rename `uneffectfulHref` to `hrefPure` (used in `Show` instance) (#21 by @JordanMartinez)

bower.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"purescript-tuples": "^7.0.0"
2020
},
2121
"devDependencies": {
22-
"purescript-assert": "^6.0.0"
22+
"purescript-assert": "^6.0.0",
23+
"purescript-ordered-collections": "^3.1.1"
2324
}
2425
}

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
"scripts": {
44
"clean": "rimraf output && rimraf .pulp-cache",
55
"build": "eslint src && pulp build -- --censor-lib --strict",
6-
"test": "pulp test -- --censor-lib --strict"
6+
"test": "pulp test -- --censor-lib --strict",
7+
"fmt": "purs-tidy format-in-place 'src/**/*.purs' 'test/**/*.purs'"
78
},
89
"devDependencies": {
910
"eslint": "^7.15.0",
1011
"pulp": "16.0.0-0",
1112
"purescript-psa": "^0.8.2",
13+
"purs-tidy": "^0.10.0",
1214
"rimraf": "^3.0.2"
1315
}
1416
}

src/Node/URL/URLSearchParams.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ export const entriesImpl = (params, tuple) => {
2121
return arr;
2222
};
2323
export const keysImpl = (params) => {
24-
Array.from(params.keys());
24+
return Array.from(params.keys());
2525
};
2626
export const valuesImpl = (params) => {
27-
Array.from(params.values());
27+
return Array.from(params.values());
2828
};

test/Main.purs

+46-4
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,53 @@ import Prelude
44

55
import Effect (Effect)
66
import Node.URL as URL
7+
import Node.URL.URLSearchParams as URL.Search
8+
import Foreign (unsafeReadTagged)
9+
import Data.Bifunctor (lmap)
10+
import Control.Monad.Except (runExcept)
11+
import Control.Monad.Error.Class (liftEither)
12+
import Effect.Exception (error)
13+
import Data.Traversable (for)
14+
import Data.Tuple (Tuple(..))
15+
import Data.Map as Map
716
import Test.Assert (assertEqual)
817

918
main Effect Unit
1019
main = do
11-
let urlStr = "http://example.com/"
12-
url <- URL.new urlStr
13-
urlStr' <- URL.format url
14-
assertEqual { expected: urlStr, actual: urlStr' }
20+
-- Simple roundtrip
21+
do
22+
let urlStr = "http://example.com/"
23+
url <- URL.new urlStr
24+
urlStr' <- URL.format url
25+
assertEqual { expected: urlStr, actual: urlStr' }
26+
27+
-- URLSearchParams
28+
do
29+
let urlStr = "http://example.com/?k&v=a&k&v=b"
30+
url <- URL.new urlStr
31+
search <- URL.searchParams url
32+
keys <- URL.Search.keys search
33+
valuesForeign <- URL.Search.values search
34+
35+
let
36+
getStringOrThrow =
37+
liftEither
38+
<<< lmap (error <<< show)
39+
<<< runExcept
40+
<<< unsafeReadTagged "String"
41+
42+
values <- for valuesForeign getStringOrThrow
43+
44+
map <- Map.fromFoldable <$> for keys \k -> do
45+
vs <- URL.Search.getAll k search
46+
pure $ Tuple k vs
47+
48+
assertEqual { actual: keys, expected: [ "k", "v", "k", "v" ] }
49+
assertEqual { actual: values, expected: [ "", "a", "", "b" ] }
50+
assertEqual
51+
{ actual: map
52+
, expected: Map.fromFoldable
53+
[ Tuple "k" [ "", "" ]
54+
, Tuple "v" [ "a", "b" ]
55+
]
56+
}

0 commit comments

Comments
 (0)