diff --git a/CHANGELOG.md b/CHANGELOG.md index 3128f8e..014e038 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Breaking changes: New features: Bugfixes: + - `URLSearchParams.keys` and `.values` returned undefined due to a bug in the foreign code (#22 by @cakekindel) Other improvements: - Rename `uneffectfulHref` to `hrefPure` (used in `Show` instance) (#21 by @JordanMartinez) diff --git a/bower.json b/bower.json index 4470a66..197975b 100644 --- a/bower.json +++ b/bower.json @@ -19,6 +19,7 @@ "purescript-tuples": "^7.0.0" }, "devDependencies": { - "purescript-assert": "^6.0.0" + "purescript-assert": "^6.0.0", + "purescript-ordered-collections": "^3.1.1" } } diff --git a/package.json b/package.json index 4ed063e..6c93cdb 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,14 @@ "scripts": { "clean": "rimraf output && rimraf .pulp-cache", "build": "eslint src && pulp build -- --censor-lib --strict", - "test": "pulp test -- --censor-lib --strict" + "test": "pulp test -- --censor-lib --strict", + "fmt": "purs-tidy format-in-place 'src/**/*.purs' 'test/**/*.purs'" }, "devDependencies": { "eslint": "^7.15.0", "pulp": "16.0.0-0", "purescript-psa": "^0.8.2", + "purs-tidy": "^0.10.0", "rimraf": "^3.0.2" } } diff --git a/src/Node/URL/URLSearchParams.js b/src/Node/URL/URLSearchParams.js index 3c185cd..55aa984 100644 --- a/src/Node/URL/URLSearchParams.js +++ b/src/Node/URL/URLSearchParams.js @@ -21,8 +21,8 @@ export const entriesImpl = (params, tuple) => { return arr; }; export const keysImpl = (params) => { - Array.from(params.keys()); + return Array.from(params.keys()); }; export const valuesImpl = (params) => { - Array.from(params.values()); + return Array.from(params.values()); }; diff --git a/test/Main.purs b/test/Main.purs index dd259bb..f66190f 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -4,11 +4,53 @@ import Prelude import Effect (Effect) import Node.URL as URL +import Node.URL.URLSearchParams as URL.Search +import Foreign (unsafeReadTagged) +import Data.Bifunctor (lmap) +import Control.Monad.Except (runExcept) +import Control.Monad.Error.Class (liftEither) +import Effect.Exception (error) +import Data.Traversable (for) +import Data.Tuple (Tuple(..)) +import Data.Map as Map import Test.Assert (assertEqual) main ∷ Effect Unit main = do - let urlStr = "http://example.com/" - url <- URL.new urlStr - urlStr' <- URL.format url - assertEqual { expected: urlStr, actual: urlStr' } + -- Simple roundtrip + do + let urlStr = "http://example.com/" + url <- URL.new urlStr + urlStr' <- URL.format url + assertEqual { expected: urlStr, actual: urlStr' } + + -- URLSearchParams + do + let urlStr = "http://example.com/?k&v=a&k&v=b" + url <- URL.new urlStr + search <- URL.searchParams url + keys <- URL.Search.keys search + valuesForeign <- URL.Search.values search + + let + getStringOrThrow = + liftEither + <<< lmap (error <<< show) + <<< runExcept + <<< unsafeReadTagged "String" + + values <- for valuesForeign getStringOrThrow + + map <- Map.fromFoldable <$> for keys \k -> do + vs <- URL.Search.getAll k search + pure $ Tuple k vs + + assertEqual { actual: keys, expected: [ "k", "v", "k", "v" ] } + assertEqual { actual: values, expected: [ "", "a", "", "b" ] } + assertEqual + { actual: map + , expected: Map.fromFoldable + [ Tuple "k" [ "", "" ] + , Tuple "v" [ "a", "b" ] + ] + }