From ac540d31a28df39c0030873029c9bba57e2a0541 Mon Sep 17 00:00:00 2001 From: Dmitry Ivakhnenko Date: Sat, 9 Dec 2023 11:26:31 +0300 Subject: [PATCH 1/2] Revert "Ship `regexparam` with optional wildcard support." This reverts commit e284411dad8066eb30ecfc98ca9a3a4e42dc8915. --- packages/wouter-preact/rollup.config.js | 3 +- packages/wouter-preact/types/index.d.ts | 2 +- packages/wouter-preact/types/regexparam.d.ts | 29 ------------- packages/wouter/rollup.config.js | 11 +---- packages/wouter/src/regexparam.js | 44 -------------------- packages/wouter/types/index.d.ts | 2 +- packages/wouter/types/regexparam.d.ts | 29 ------------- 7 files changed, 4 insertions(+), 116 deletions(-) delete mode 100644 packages/wouter-preact/types/regexparam.d.ts delete mode 100644 packages/wouter/src/regexparam.js delete mode 100644 packages/wouter/types/regexparam.d.ts diff --git a/packages/wouter-preact/rollup.config.js b/packages/wouter-preact/rollup.config.js index fbb94521..f211cff0 100644 --- a/packages/wouter-preact/rollup.config.js +++ b/packages/wouter-preact/rollup.config.js @@ -10,7 +10,7 @@ export default defineConfig([ "wouter/use-hash-location", "wouter/memory-location", ], - external: ["preact", "preact/hooks", "mitt"], + external: ["preact", "preact/hooks", "regexparam", "mitt"], output: { dir: "esm", @@ -21,7 +21,6 @@ export default defineConfig([ alias({ entries: { "./react-deps.js": "./src/preact-deps.js", - regexparam: "wouter/src/regexparam.js", }, }), ], diff --git a/packages/wouter-preact/types/index.d.ts b/packages/wouter-preact/types/index.d.ts index 2fdfad34..483b1fd1 100644 --- a/packages/wouter-preact/types/index.d.ts +++ b/packages/wouter-preact/types/index.d.ts @@ -26,7 +26,7 @@ import { RouterObject, RouterOptions } from "./router.js"; export { Path, BaseLocationHook, BaseSearchHook } from "./location-hook.js"; export * from "./router.js"; -import { RouteParams } from "./regexparam.js"; +import { RouteParams } from "regexparam"; /** * Route patterns and parameters diff --git a/packages/wouter-preact/types/regexparam.d.ts b/packages/wouter-preact/types/regexparam.d.ts deleted file mode 100644 index 40cd1805..00000000 --- a/packages/wouter-preact/types/regexparam.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export function parse( - route: string, - loose?: boolean -): { - keys: string[]; - pattern: RegExp; -}; - -export function parse(route: RegExp): { - keys: false; - pattern: RegExp; -}; - -export type RouteParams = - T extends `${infer Prev}/*/${infer Rest}` - ? RouteParams & { wild: string } & RouteParams - : T extends `${string}:${infer P}?/${infer Rest}` - ? { [K in P]?: string } & RouteParams - : T extends `${string}:${infer P}/${infer Rest}` - ? { [K in P]: string } & RouteParams - : T extends `${string}:${infer P}?` - ? { [K in P]?: string } - : T extends `${string}:${infer P}` - ? { [K in P]: string } - : T extends `${string}*` - ? { wild: string } - : T extends `${string}*?` - ? { wild?: string } - : {}; diff --git a/packages/wouter/rollup.config.js b/packages/wouter/rollup.config.js index 751841bb..37558e64 100644 --- a/packages/wouter/rollup.config.js +++ b/packages/wouter/rollup.config.js @@ -1,5 +1,4 @@ import { defineConfig } from "rollup"; -import alias from "@rollup/plugin-alias"; export default defineConfig([ { @@ -21,18 +20,10 @@ export default defineConfig([ "src/use-hash-location.js", "src/memory-location.js", ], - external: [/react-deps/, "mitt"], + external: [/react-deps/, "regexparam", "mitt"], output: { dir: "esm", format: "esm", }, - - plugins: [ - alias({ - entries: { - regexparam: "./src/regexparam.js", - }, - }), - ], }, ]); diff --git a/packages/wouter/src/regexparam.js b/packages/wouter/src/regexparam.js deleted file mode 100644 index 41e3e70e..00000000 --- a/packages/wouter/src/regexparam.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * The function below was extracted from the `regexparam` package. - * It has been modified to support optional wildcards, which is - * addressed in this PR https://github.com/lukeed/regexparam/pull/25 - * - * The original source code is distributed under the MIT license - * and is available at: https://github.com/lukeed/regexparam - * - * Copyright: Luke Edwards - */ - -export function parse(str, loose) { - if (str instanceof RegExp) return { keys: false, pattern: str }; - var c, - o, - tmp, - ext, - keys = [], - pattern = "", - arr = str.split("/"); - arr[0] || arr.shift(); - - while ((tmp = arr.shift())) { - c = tmp[0]; - if (c === "*") { - o = tmp[1] === "?"; - keys.push("wild"); - pattern += o ? "(?:/(.*))?" : "/(.*)"; - } else if (c === ":") { - o = tmp.indexOf("?", 1); - ext = tmp.indexOf(".", 1); - keys.push(tmp.substring(1, !!~o ? o : !!~ext ? ext : tmp.length)); - pattern += !!~o && !~ext ? "(?:/([^/]+?))?" : "/([^/]+?)"; - if (!!~ext) pattern += (!!~o ? "?" : "") + "\\" + tmp.substring(ext); - } else { - pattern += "/" + tmp; - } - } - - return { - keys: keys, - pattern: new RegExp("^" + pattern + (loose ? "(?=$|/)" : "/?$"), "i"), - }; -} diff --git a/packages/wouter/types/index.d.ts b/packages/wouter/types/index.d.ts index 53f89bef..f3e9a7ae 100644 --- a/packages/wouter/types/index.d.ts +++ b/packages/wouter/types/index.d.ts @@ -30,7 +30,7 @@ import { RouterObject, RouterOptions } from "./router.js"; export { Path, BaseLocationHook, BaseSearchHook } from "./location-hook.js"; export * from "./router.js"; -import { RouteParams } from "./regexparam.js"; +import { RouteParams } from "regexparam"; /** * Route patterns and parameters diff --git a/packages/wouter/types/regexparam.d.ts b/packages/wouter/types/regexparam.d.ts deleted file mode 100644 index 40cd1805..00000000 --- a/packages/wouter/types/regexparam.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -export function parse( - route: string, - loose?: boolean -): { - keys: string[]; - pattern: RegExp; -}; - -export function parse(route: RegExp): { - keys: false; - pattern: RegExp; -}; - -export type RouteParams = - T extends `${infer Prev}/*/${infer Rest}` - ? RouteParams & { wild: string } & RouteParams - : T extends `${string}:${infer P}?/${infer Rest}` - ? { [K in P]?: string } & RouteParams - : T extends `${string}:${infer P}/${infer Rest}` - ? { [K in P]: string } & RouteParams - : T extends `${string}:${infer P}?` - ? { [K in P]?: string } - : T extends `${string}:${infer P}` - ? { [K in P]: string } - : T extends `${string}*` - ? { wild: string } - : T extends `${string}*?` - ? { wild?: string } - : {}; From db09ab5f40e3d61483d65d487e21f906be29612e Mon Sep 17 00:00:00 2001 From: Dmitry Ivakhnenko Date: Sat, 9 Dec 2023 11:34:59 +0300 Subject: [PATCH 2/2] fix tests --- package-lock.json | 19 +++++++--------- packages/wouter-preact/package.json | 2 +- packages/wouter/package.json | 2 +- packages/wouter/test/use-route.test.tsx | 29 +++++++++++-------------- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index b29c2c7b..ab0f8859 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5190,8 +5190,12 @@ } }, "node_modules/regexparam": { - "resolved": "packages/regexparam", - "link": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", + "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", + "engines": { + "node": ">=8" + } }, "node_modules/regexpp": { "version": "3.2.0", @@ -6494,19 +6498,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/regexparam": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "packages/wouter": { "version": "3.0.0-rc.1", "license": "ISC", "dependencies": { "mitt": "^3.0.1", - "regexparam": "^2.0.1", + "regexparam": "^3.0.0", "use-sync-external-store": "^1.0.0" }, "peerDependencies": { @@ -6518,7 +6515,7 @@ "license": "ISC", "dependencies": { "mitt": "^3.0.1", - "regexparam": "^2.0.1" + "regexparam": "^3.0.0" }, "devDependencies": { "wouter": "*" diff --git a/packages/wouter-preact/package.json b/packages/wouter-preact/package.json index 6cb77845..0e1dc389 100644 --- a/packages/wouter-preact/package.json +++ b/packages/wouter-preact/package.json @@ -64,7 +64,7 @@ }, "dependencies": { "mitt": "^3.0.1", - "regexparam": "^2.0.1" + "regexparam": "^3.0.0" }, "devDependencies": { "wouter": "*" diff --git a/packages/wouter/package.json b/packages/wouter/package.json index 2c17c6c8..a2503205 100644 --- a/packages/wouter/package.json +++ b/packages/wouter/package.json @@ -67,7 +67,7 @@ }, "dependencies": { "mitt": "^3.0.1", - "regexparam": "^2.0.1", + "regexparam": "^3.0.0", "use-sync-external-store": "^1.0.0" } } diff --git a/packages/wouter/test/use-route.test.tsx b/packages/wouter/test/use-route.test.tsx index f78a13c2..bfca9eae 100644 --- a/packages/wouter/test/use-route.test.tsx +++ b/packages/wouter/test/use-route.test.tsx @@ -36,18 +36,18 @@ it("ignores the trailing slash", () => { }); it("supports trailing wildcards", () => { - assertRoute("/app/*", "/app/", { wild: "" }); - assertRoute("/app/*", "/app/dashboard/intro", { wild: "dashboard/intro" }); - assertRoute("/app/*", "/app/charges/1", { wild: "charges/1" }); + assertRoute("/app/*", "/app/", { "*": "" }); + assertRoute("/app/*", "/app/dashboard/intro", { "*": "dashboard/intro" }); + assertRoute("/app/*", "/app/charges/1", { "*": "charges/1" }); }); it("supports wildcards in the middle of the pattern", () => { - assertRoute("/app/*/settings", "/app/users/settings", { wild: "users" }); - assertRoute("/app/*/settings", "/app/users/1/settings", { wild: "users/1" }); + assertRoute("/app/*/settings", "/app/users/settings", { "*": "users" }); + assertRoute("/app/*/settings", "/app/users/1/settings", { "*": "users/1" }); - assertRoute("/*/payments/:id", "/home/payments/1", { wild: "home", id: "1" }); + assertRoute("/*/payments/:id", "/home/payments/1", { "*": "home", id: "1" }); assertRoute("/*/payments/:id?", "/home/payments", { - wild: "home", + "*": "home", id: undefined, }); }); @@ -75,12 +75,12 @@ it("uses a question mark to define optional segments", () => { }); it("supports optional wildcards", () => { - assertRoute("/app/*?", "/app/blog/mac", { wild: "blog/mac" }); - assertRoute("/app/*?", "/app", { wild: undefined }); - assertRoute("/app/*?/dashboard", "/app/v1/dashboard", { wild: "v1" }); - assertRoute("/app/*?/dashboard", "/app/dashboard", { wild: undefined }); + assertRoute("/app/*?", "/app/blog/mac", { "*": "blog/mac" }); + assertRoute("/app/*?", "/app", { "*": undefined }); + assertRoute("/app/*?/dashboard", "/app/v1/dashboard", { "*": "v1" }); + assertRoute("/app/*?/dashboard", "/app/dashboard", { "*": undefined }); assertRoute("/app/*?/users/:name", "/app/users/karen", { - wild: undefined, + "*": undefined, name: "karen", }); }); @@ -133,10 +133,7 @@ it("reacts to pattern updates", () => { expect(result.current).toStrictEqual([false, null]); rerender({ pattern: "/blog/*" }); - expect(result.current).toStrictEqual([ - true, - { wild: "products/40/read-all" }, - ]); + expect(result.current).toStrictEqual([true, { "*": "products/40/read-all" }]); }); it("reacts to location updates", () => {