diff --git a/.babelrc.js b/.babelrc.js deleted file mode 100644 index a376365..0000000 --- a/.babelrc.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - presets: [ - [ - '@babel/preset-env', - { - targets: { - node: 'current', - }, - }, - ], - ], - plugins: ['@babel/plugin-proposal-object-rest-spread'], -}; diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 3e6fcac..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - extends: ['gowento'], - rules: { - 'lodash/prefer-lodash-typecheck': 'off', - 'lodash/prefer-includes': 'off', - 'lodash/prefer-constant': 'off', - 'filenames/match-regex': 'off', - 'filenames/match-exported': 'off', - }, -}; diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index abd8010..0000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: - - v14 - - v12 - - v10 -after_script: - - 'npm run coveralls' diff --git a/README.md b/README.md index 1b5eeb7..783b969 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # api-query-params [![NPM version][npm-image]][npm-url] -[![Build Status][travis-image]][travis-url] + [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status][depstat-image]][depstat-url] [![Downloads][download-badge]][npm-url] diff --git a/ava.config.js b/ava.config.js index c879884..f63325a 100644 --- a/ava.config.js +++ b/ava.config.js @@ -1,4 +1,3 @@ export default { verbose: true, - require: ['@babel/register'], }; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..7c14899 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,17 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; + +export default [ + { + languageOptions: { + globals: { + ...globals.node, + ...globals.mocha, + }, + }, + rules: { + "no-unused-vars": ["error", { "varsIgnorePattern": "^_" }], + }, + }, + pluginJs.configs.recommended, +]; \ No newline at end of file diff --git a/package.json b/package.json index 5d40645..9eecd27 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,26 @@ { "name": "api-query-params", - "version": "5.4.0", + "version": "6.0.0", "description": "Convert query parameters from API urls to MongoDB queries", - "main": "dist/cjs/index.js", - "types": "dist/cjs/types.d.ts", + "main": "src/index.js", + "types": "types.d.ts", + "type": "module", "files": [ - "dist/" + "src/", + "types.d.ts" ], "scripts": { - "build": "babel ./src/index.js --out-file ./dist/cjs/index.js && shx cp ./types.d.ts ./dist/cjs/", "coverage": "nyc npm test && nyc report --reporter=html", "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls", "lint": "eslint ./src ./test", "postcoveralls": "rimraf ./coverage", - "prebuild": "npm run lint && rimraf ./dist && mkdirp ./dist/cjs", - "prepublish": "npm run build", + "prepublish": "yarn run test", "release": "np", "test": "ava" }, + "engines": { + "node": ">=18" + }, "repository": { "type": "git", "url": "git+https://github.com/loris/api-query-params.git" @@ -35,20 +38,12 @@ }, "homepage": "https://github.com/loris/api-query-params#readme", "devDependencies": { - "@babel/cli": "7.16.0", - "@babel/core": "7.16.0", - "@babel/plugin-proposal-object-rest-spread": "7.16.0", - "@babel/preset-env": "7.16.4", - "@babel/register": "7.16.0", - "ava": "3.15.0", - "coveralls": "3.1.1", - "eslint": "7.9.0", - "eslint-config-gowento": "7.0.0", - "mkdirp": "1.0.4", - "np": "7.6.0", - "nyc": "15.1.0", - "prettier": "2.4.1", - "rimraf": "3.0.2", - "shx": "^0.3.3" + "ava": "^6.1.3", + "coveralls": "^3.1.1", + "eslint": "^9.4.0", + "np": "^10.0.5", + "nyc": "^17.0.0", + "prettier": "^3.3.2", + "rimraf": "^6.0.1" } } diff --git a/src/index.js b/src/index.js index 85351af..fd838fd 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,4 @@ -import qs from 'querystring'; + const builtInCasters = { boolean: (val) => val === 'true', @@ -119,7 +119,9 @@ const parseUnaries = (unaries, values = { plus: 1, minus: -1 }) => { const parseJSONString = (string) => { try { return JSON.parse(string); - } catch (err) { + } + // eslint-disable-next-line no-unused-vars + catch (_err) { return false; } }; @@ -287,7 +289,25 @@ const operators = [ const aqp = (query = '', options = {}) => { const result = {}; - const params = typeof query === 'string' ? qs.parse(query) : query; + let params; + + if (typeof query === 'string') { + params = {}; + const urlSearchParams = new URLSearchParams(query); + for (const [key, value] of urlSearchParams.entries()) { + if (params[key]) { + if (Array.isArray(params[key])) { + params[key].push(value); + } else { + params[key] = [params[key], value]; + } + } else { + params[key] = value; + } + } + } else { + params = query; + } options.blacklist = options.blacklist || []; @@ -306,5 +326,4 @@ const aqp = (query = '', options = {}) => { return result; }; -module.exports = aqp; -module.exports.default = aqp; +export default aqp; diff --git a/test/index.js b/test/index.js index e6a5ad3..e3e31a7 100644 --- a/test/index.js +++ b/test/index.js @@ -1,12 +1,7 @@ import test from 'ava'; -import aqp from '../src'; +import aqp from '../src/index.js'; -const requiredAqp = require('../src'); -test('module imported using require', (t) => { - const res = requiredAqp('key=value'); - t.truthy(res); -}); test('filter: basic', (t) => { const res = aqp('key=value');