From 7ad1446b5558f163d52e77ca3166f25f38a91dd7 Mon Sep 17 00:00:00 2001 From: u Date: Fri, 3 Mar 2023 14:26:23 +0100 Subject: [PATCH 1/6] feat: generic types for `getQuery` util. --- .gitignore | 1 + src/query.ts | 5 +++-- src/utils.ts | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 96537549..a6fcea55 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vscode +.idea node_modules *.log .DS_Store diff --git a/src/query.ts b/src/query.ts index 78ab28cf..1d45970d 100644 --- a/src/query.ts +++ b/src/query.ts @@ -10,11 +10,12 @@ export type QueryValue = | number | undefined | null + | boolean | Record; export type QueryObject = Record; -export function parseQuery(parametersString = ""): QueryObject { - const object: QueryObject = {}; +export function parseQuery(parametersString = ""): T { + const object = {} as T; if (parametersString[0] === "?") { parametersString = parametersString.slice(1); } diff --git a/src/utils.ts b/src/utils.ts index 3c8f7f93..fc4854d5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -126,8 +126,8 @@ export function withQuery(input: string, query: QueryObject): string { return stringifyParsedURL(parsed); } -export function getQuery(input: string): QueryObject { - return parseQuery(parseURL(input).search); +export function getQuery(input: string): T { + return parseQuery(parseURL(input).search); } export function isEmptyURL(url: string) { From 0dc166d9219aaa74452e6c5b23dfa34a381f76bf Mon Sep 17 00:00:00 2001 From: Oleg Khalin Date: Mon, 13 Mar 2023 12:06:29 +0100 Subject: [PATCH 2/6] Update src/utils.ts Co-authored-by: pooya parsa --- src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index fc4854d5..040d0971 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -126,7 +126,7 @@ export function withQuery(input: string, query: QueryObject): string { return stringifyParsedURL(parsed); } -export function getQuery(input: string): T { +export function getQuery(input: string): T { return parseQuery(parseURL(input).search); } From 68109d2d230a94cb340105e8fcd0590fd64e12b6 Mon Sep 17 00:00:00 2001 From: Oleg Khalin Date: Mon, 13 Mar 2023 12:06:35 +0100 Subject: [PATCH 3/6] Update src/query.ts Co-authored-by: pooya parsa --- src/query.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/query.ts b/src/query.ts index 1d45970d..5fbb87e8 100644 --- a/src/query.ts +++ b/src/query.ts @@ -14,7 +14,7 @@ export type QueryValue = | Record; export type QueryObject = Record; -export function parseQuery(parametersString = ""): T { +export function parseQuery(parametersString = ""): T { const object = {} as T; if (parametersString[0] === "?") { parametersString = parametersString.slice(1); From a046a4e1ba0a612e5046a001f86a66ba9a2bd81c Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 13 Mar 2023 13:23:21 +0000 Subject: [PATCH 4/6] fix: add parsed query value type --- package.json | 2 +- src/query.ts | 13 +++++++++---- src/utils.ts | 11 +++++++++-- test/query.test-d.ts | 9 +++++++++ test/query.test.ts | 4 ++++ 5 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 test/query.test-d.ts diff --git a/package.json b/package.json index d656677c..c94459f9 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "lint:fix": "eslint --fix --ext .ts . && prettier -w src test", "prepack": "pnpm build", "release": "pnpm test && changelogen --release && npm publish && git push --follow-tags", - "test": "pnpm lint && vitest run" + "test": "pnpm lint && vitest run && vitest typecheck" }, "devDependencies": { "@types/node": "^18.14.4", diff --git a/src/query.ts b/src/query.ts index 5fbb87e8..d61e4cae 100644 --- a/src/query.ts +++ b/src/query.ts @@ -11,11 +11,16 @@ export type QueryValue = | undefined | null | boolean + | Array | Record; +export type ParsedQueryValue = string | Array; export type QueryObject = Record; +export type ParsedQueryObject = Record; -export function parseQuery(parametersString = ""): T { - const object = {} as T; +export function parseQuery( + parametersString = "" +): T { + const object = {} as ParsedQueryObject; if (parametersString[0] === "?") { parametersString = parametersString.slice(1); } @@ -24,7 +29,7 @@ export function parseQuery(parametersString if (s.length < 2) { continue; } - const key = decode(s[1]); + const key: keyof ParsedQueryObject = decode(s[1]); if (key === "__proto__" || key === "constructor") { continue; } @@ -39,7 +44,7 @@ export function parseQuery(parametersString object[key] = value; } } - return object; + return object as T; } export function encodeQueryItem( diff --git a/src/utils.ts b/src/utils.ts index 040d0971..b98b97ea 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,11 @@ import { $URL } from "./url"; import { parseURL, stringifyParsedURL } from "./parse"; -import { QueryObject, parseQuery, stringifyQuery } from "./query"; +import { + QueryObject, + parseQuery, + stringifyQuery, + ParsedQueryObject, +} from "./query"; import { decode } from "./encoding"; export function isRelative(inputString: string) { @@ -126,7 +131,9 @@ export function withQuery(input: string, query: QueryObject): string { return stringifyParsedURL(parsed); } -export function getQuery(input: string): T { +export function getQuery( + input: string +): T { return parseQuery(parseURL(input).search); } diff --git a/test/query.test-d.ts b/test/query.test-d.ts new file mode 100644 index 00000000..ad4af73a --- /dev/null +++ b/test/query.test-d.ts @@ -0,0 +1,9 @@ +import { describe, expectTypeOf, test } from "vitest"; +import { getQuery } from "../src"; + +describe("getQuery", () => { + test("type tests for getQuery", () => { + const result = getQuery<{ foo: string }>("http://foo.com/?foo=bar"); + expectTypeOf(result).toEqualTypeOf<{ foo: string }>(); + }); +}); diff --git a/test/query.test.ts b/test/query.test.ts index ddc739d9..2ec53750 100644 --- a/test/query.test.ts +++ b/test/query.test.ts @@ -71,6 +71,10 @@ describe("getQuery", () => { }, "http://foo.com/?param=3¶m=": { param: ["3", ""] }, "http://foo.com/?param=¶m=3": { param: ["", "3"] }, + "http://foo.com/?param=": { param: "" }, + "http://foo.com/?param=%7B%22a%22:%5B%7B%22obj%22:%5B1,2,3%5D%7D%5D%7D": { + param: '{"a":[{"obj":[1,2,3]}]}', + }, }; for (const t in tests) { From b839c568ecf6fdca3c987afa9b3a42eefd804487 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 4 May 2023 01:23:13 +0200 Subject: [PATCH 5/6] pass --run flag for typescheck --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f61ea00d..05e27d1e 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "lint:fix": "eslint --fix --ext .ts . && prettier -w src test", "prepack": "pnpm build", "release": "pnpm test && changelogen --release && npm publish && git push --follow-tags", - "test": "pnpm lint && vitest run && vitest typecheck" + "test": "pnpm lint && vitest run && vitest --run typecheck" }, "devDependencies": { "@types/node": "^18.16.3", From cf946cfa7addc480f2a20a2c879808294dcdd195 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Fri, 28 Jul 2023 18:49:01 +0200 Subject: [PATCH 6/6] update type tests --- package.json | 2 +- test/query.test-d.ts | 9 --------- test/types.test-d.ts | 14 ++++++++++++++ 3 files changed, 15 insertions(+), 10 deletions(-) delete mode 100644 test/query.test-d.ts create mode 100644 test/types.test-d.ts diff --git a/package.json b/package.json index faf0f7f5..51dd8b03 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "lint:fix": "eslint --fix --ext .ts . && prettier -w src test", "prepack": "pnpm build", "release": "pnpm test && changelogen --release && npm publish && git push --follow-tags", - "test": "pnpm lint && vitest run && vitest --run typecheck" + "test": "pnpm lint && vitest --run typecheck && vitest run" }, "devDependencies": { "@types/node": "^20.4.5", diff --git a/test/query.test-d.ts b/test/query.test-d.ts deleted file mode 100644 index ad4af73a..00000000 --- a/test/query.test-d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { describe, expectTypeOf, test } from "vitest"; -import { getQuery } from "../src"; - -describe("getQuery", () => { - test("type tests for getQuery", () => { - const result = getQuery<{ foo: string }>("http://foo.com/?foo=bar"); - expectTypeOf(result).toEqualTypeOf<{ foo: string }>(); - }); -}); diff --git a/test/types.test-d.ts b/test/types.test-d.ts new file mode 100644 index 00000000..e28c503e --- /dev/null +++ b/test/types.test-d.ts @@ -0,0 +1,14 @@ +import { describe, expectTypeOf, test } from "vitest"; +import { getQuery, parseQuery } from "../src"; + +describe("query", () => { + test("getQuery generic type support", () => { + const result = getQuery<{ foo: string }>("http://foo.com/?foo=bar"); + expectTypeOf(result).toEqualTypeOf<{ foo: string }>(); + }); + + test("parseQuery generic type support", () => { + const result = parseQuery<{ foo: string }>("http://foo.com/?foo=bar"); + expectTypeOf(result).toEqualTypeOf<{ foo: string }>(); + }); +});