mirror of
https://github.com/spacebarchat/server.git
synced 2026-03-31 09:25:43 +00:00
make normalize URL normal
This commit is contained in:
@@ -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());
|
||||
};
|
||||
@@ -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}"`);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,3 +1,2 @@
|
||||
export * from "./Array";
|
||||
export * from "./Url";
|
||||
export * from "./String";
|
||||
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user