This commit is contained in:
2026-09-17 23:00:47 +08:00
parent def731fc5a
commit 8883a5c506
43 changed files with 4530 additions and 1515 deletions
+71 -1
View File
@@ -4,7 +4,7 @@
const { describe, it } = require("node:test");
const assert = require("node:assert/strict");
const { isDomainMatch, escapeHtml } = require("../dist/utils.js");
const { isDomainMatch, escapeHtml, toMatchPatterns } = require("../dist/utils.js");
describe("isDomainMatch - 纯 hostname 匹配", () => {
it("精确域名匹配", () => {
@@ -81,6 +81,76 @@ describe("isDomainMatch - hostname + path 匹配", () => {
});
});
describe("toMatchPatterns - 配置域名转 match pattern", () => {
it("纯域名同时生成 http / https 两条", () => {
assert.deepEqual(toMatchPatterns("example.com"), [
"http://example.com/*",
"https://example.com/*",
]);
});
it("带协议前缀的配置会被剥离", () => {
assert.deepEqual(toMatchPatterns("https://example.com"), [
"http://example.com/*",
"https://example.com/*",
]);
});
it("子域名通配符 *.example.com 保持原样", () => {
assert.deepEqual(toMatchPatterns("*.example.com"), [
"http://*.example.com/*",
"https://*.example.com/*",
]);
});
it("路径规则按前缀截断到第一个 *", () => {
assert.deepEqual(toMatchPatterns("oa.com/login/*"), [
"http://oa.com/login/*",
"https://oa.com/login/*",
]);
// 中间通配无法表达,截断成前缀(放宽注入范围,精度仍由 isDomainMatch 把关)
assert.deepEqual(toMatchPatterns("site.com/a/*/b"), [
"http://site.com/a/*",
"https://site.com/a/*",
]);
});
it("无通配的路径补上结尾 *", () => {
assert.deepEqual(toMatchPatterns("oa.com/admin"), [
"http://oa.com/admin*",
"https://oa.com/admin*",
]);
});
it("去掉端口(match pattern 不支持端口)", () => {
assert.deepEqual(toMatchPatterns("example.com:8080/app"), [
"http://example.com/app*",
"https://example.com/app*",
]);
});
it("中文域名转成 punycode", () => {
assert.deepEqual(toMatchPatterns("中文域名.中国"), [
"http://xn--fiq06l2rdsvs.xn--fiqs8s/*",
"https://xn--fiq06l2rdsvs.xn--fiqs8s/*",
]);
});
it("query / hash 会被忽略", () => {
assert.deepEqual(toMatchPatterns("oa.com/login?next=/home#x"), [
"http://oa.com/login*",
"https://oa.com/login*",
]);
});
it("无法表达的规则返回空数组", () => {
assert.deepEqual(toMatchPatterns(""), []);
assert.deepEqual(toMatchPatterns(null), []);
assert.deepEqual(toMatchPatterns("*"), []); // 裸通配
assert.deepEqual(toMatchPatterns("a.*.b.com"), []); // 中间通配的 host
});
});
describe("escapeHtml", () => {
it("转义 5 个特殊字符", () => {
assert.equal(escapeHtml("<"), "&lt;");