make normalize URL normal

This commit is contained in:
MathMan05
2025-11-26 00:06:05 -06:00
parent 960752a685
commit b1fc5dc305
4 changed files with 2 additions and 58 deletions

View File

@@ -16,19 +16,6 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare module "url" {
interface URL {
normalize(): string;
}
}
/**
* Normalize a URL by:
* - Removing trailing slashes (except root path)
* - Sorting query params alphabetically
* - Removing empty query strings
* - Removing fragments
*/
export function normalizeUrl(input: string): string {
try {
const u = new URL(input);
@@ -52,9 +39,3 @@ export function normalizeUrl(input: string): string {
return input;
}
}
// register extensions
if (!URL.prototype.normalize)
URL.prototype.normalize = function () {
return normalizeUrl(this.toString());
};

View File

@@ -1,37 +0,0 @@
import moduleAlias from "module-alias";
moduleAlias();
import './Url';
import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
describe("URL extensions", () => {
it("normalize", async () => {
const tests: [string, string][] = [
["http://example.com", "http://example.com/"],
["http://example.com/", "http://example.com/"],
["http://example.com/path/", "http://example.com/path"],
["http://example.com/path//", "http://example.com/path/"],
["http://example.com/path?b=2&a=1", "http://example.com/path?a=1&b=2"],
["http://example.com/path?b=2&a=1&", "http://example.com/path?a=1&b=2"],
["http://example.com/path?", "http://example.com/path"],
["http://example.com/path#fragment", "http://example.com/path"],
["http://example.com/path/?b=2&a=1#fragment", "http://example.com/path?a=1&b=2"],
["ftp://example.com/resource/", "ftp://example.com/resource"],
["https://example.com/resource?z=3&y=2&x=1", "https://example.com/resource?x=1&y=2&z=3"],
["https://example.com/resource?z=3&y=2&x=1#", "https://example.com/resource?x=1&y=2&z=3"],
["https://example.com/resource?z=3&y=2&x=1#section", "https://example.com/resource?x=1&y=2&z=3"],
["https://example.com/resource/?z=3&y=2&x=1#section", "https://example.com/resource?x=1&y=2&z=3"],
["https://example.com/resource//?z=3&y=2&x=1#section", "https://example.com/resource/?x=1&y=2&z=3"],
["https://example.com/", "https://example.com/"],
["https://example.com", "https://example.com/"],
];
for (const [input, expected] of tests) {
assert.doesNotThrow(() => new URL(input), `URL("${input}") should not throw`);
const url = new URL(input);
const normalized = url.normalize();
assert.strictEqual(normalized, expected, `normalize("${input}") = "${normalized}", expected "${expected}"`);
}
});
});

View File

@@ -1,3 +1,2 @@
export * from "./Array";
export * from "./Url";
export * from "./String";

View File

@@ -48,4 +48,5 @@ export * from "./Application";
export * from "./NameValidation";
export * from "../../schemas/HelperTypes";
export * from "./extensions";
export * from "./Random";
export * from "./Random";
export * from "./Url";