@fedify/vocab-runtime 2.3.0-dev.1050 → 2.3.0-dev.1079
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +1 -2
- package/dist/jsonld.cjs +1 -1
- package/dist/mod.cjs +4334 -4360
- package/dist/mod.js +4332 -4358
- package/dist/tests/{chunk-Do9eywBl.cjs → chunk-C2EiDwsr.cjs} +1 -1
- package/dist/tests/decimal.test.cjs +4 -4
- package/dist/tests/decimal.test.mjs +3 -3
- package/dist/tests/docloader-CFo7CET9.cjs +4543 -0
- package/dist/tests/docloader-Cx0cPVYk.mjs +4531 -0
- package/dist/tests/docloader.test.cjs +4 -4
- package/dist/tests/docloader.test.mjs +4 -4
- package/dist/tests/internal/multicodec.test.cjs +1 -1
- package/dist/tests/{key-BeTHFQJK.mjs → key-CrrK9mYh.mjs} +1 -1
- package/dist/tests/{key-DTTIntwb.cjs → key-pMmqUKuo.cjs} +2 -2
- package/dist/tests/key.test.cjs +3 -3
- package/dist/tests/key.test.mjs +2 -2
- package/dist/tests/langstr.test.cjs +2 -2
- package/dist/tests/link.test.cjs +1 -1
- package/dist/tests/multibase/multibase.test.cjs +2 -2
- package/dist/tests/multibase/multibase.test.mjs +1 -1
- package/dist/tests/{multibase-BgU9XRf7.mjs → multibase-B4bvakyA.mjs} +3 -0
- package/dist/tests/{multibase-F7LtMMsK.cjs → multibase-Bz_UUDtL.cjs} +5 -2
- package/dist/tests/{request-BpgWmk-q.mjs → request-C9WvvfOf.mjs} +1 -1
- package/dist/tests/{request-CmmSAhWN.cjs → request-D1_CJkbx.cjs} +3 -3
- package/dist/tests/request.test.cjs +3 -3
- package/dist/tests/request.test.mjs +1 -1
- package/dist/tests/{url-BQ_kgmCk.mjs → url-BzGwIxB4.mjs} +11 -2
- package/dist/tests/{url-pFuSds44.cjs → url-CEmGms8t.cjs} +12 -3
- package/dist/tests/url.test.cjs +5 -2
- package/dist/tests/url.test.mjs +4 -1
- package/package.json +5 -5
- package/src/url.test.ts +6 -0
- package/src/url.ts +17 -8
- package/tsdown.config.ts +2 -2
- package/dist/tests/docloader-C4doXlGq.cjs +0 -4581
- package/dist/tests/docloader-DRW-Ip4j.mjs +0 -4569
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
2
|
-
const require_docloader = require("./docloader-
|
|
3
|
-
const require_request = require("./request-
|
|
4
|
-
const require_url = require("./url-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_docloader = require("./docloader-CFo7CET9.cjs");
|
|
3
|
+
const require_request = require("./request-D1_CJkbx.cjs");
|
|
4
|
+
const require_url = require("./url-CEmGms8t.cjs");
|
|
5
5
|
let node_assert = require("node:assert");
|
|
6
6
|
let node_test = require("node:test");
|
|
7
7
|
//#region ../../node_modules/.pnpm/glob-to-regexp@0.4.1/node_modules/glob-to-regexp/index.js
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as preloadedContexts, t as getDocumentLoader } from "./docloader-
|
|
2
|
-
import { t as FetchError } from "./request-
|
|
3
|
-
import { t as UrlError } from "./url-
|
|
1
|
+
import { n as preloadedContexts, t as getDocumentLoader } from "./docloader-Cx0cPVYk.mjs";
|
|
2
|
+
import { t as FetchError } from "./request-C9WvvfOf.mjs";
|
|
3
|
+
import { t as UrlError } from "./url-BzGwIxB4.mjs";
|
|
4
4
|
import { deepStrictEqual, ok, rejects } from "node:assert";
|
|
5
5
|
import { test } from "node:test";
|
|
6
6
|
//#region \0rolldown/runtime.js
|
|
@@ -10,7 +10,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
10
10
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
11
11
|
var __getProtoOf = Object.getPrototypeOf;
|
|
12
12
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
13
|
-
var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
13
|
+
var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
|
|
14
14
|
var __copyProps = (to, from, except, desc) => {
|
|
15
15
|
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
16
16
|
key = keys[i];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as getMulticodecPrefix, r as removeMulticodecPrefix, t as addMulticodecPrefix } from "./multicodec-CyFp54fI.mjs";
|
|
2
|
-
import { n as encodeMultibase, t as decodeMultibase } from "./multibase-
|
|
2
|
+
import { n as encodeMultibase, t as decodeMultibase } from "./multibase-B4bvakyA.mjs";
|
|
3
3
|
import { Integer, Sequence } from "asn1js";
|
|
4
4
|
import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
|
|
5
5
|
import { decodeBase64Url } from "byte-encodings/base64url";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require("./chunk-
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
const require_multicodec = require("./multicodec-CxGVGa91.cjs");
|
|
3
|
-
const require_multibase = require("./multibase-
|
|
3
|
+
const require_multibase = require("./multibase-Bz_UUDtL.cjs");
|
|
4
4
|
let asn1js = require("asn1js");
|
|
5
5
|
let byte_encodings_base64 = require("byte-encodings/base64");
|
|
6
6
|
let byte_encodings_base64url = require("byte-encodings/base64url");
|
package/dist/tests/key.test.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require("./chunk-
|
|
2
|
-
const require_key = require("./key-
|
|
3
|
-
const require_multibase = require("./multibase-
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_key = require("./key-pMmqUKuo.cjs");
|
|
3
|
+
const require_multibase = require("./multibase-Bz_UUDtL.cjs");
|
|
4
4
|
let node_assert = require("node:assert");
|
|
5
5
|
let node_test = require("node:test");
|
|
6
6
|
//#region src/key.test.ts
|
package/dist/tests/key.test.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as importPkcs1, c as importJwk, i as importPem, n as exportSpki, o as importSpki, r as importMultibaseKey, s as exportJwk, t as exportMultibaseKey } from "./key-
|
|
2
|
-
import { n as encodeMultibase } from "./multibase-
|
|
1
|
+
import { a as importPkcs1, c as importJwk, i as importPem, n as exportSpki, o as importSpki, r as importMultibaseKey, s as exportJwk, t as exportMultibaseKey } from "./key-CrrK9mYh.mjs";
|
|
2
|
+
import { n as encodeMultibase } from "./multibase-B4bvakyA.mjs";
|
|
3
3
|
import { deepStrictEqual, rejects } from "node:assert";
|
|
4
4
|
import { test } from "node:test";
|
|
5
5
|
//#region src/key.test.ts
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
const require_langstr = require("./langstr-CbAxaeEZ.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
let node_util = require("node:util");
|
|
6
|
-
node_util = require_chunk.__toESM(node_util);
|
|
6
|
+
node_util = require_chunk.__toESM(node_util, 1);
|
|
7
7
|
//#region src/langstr.test.ts
|
|
8
8
|
(0, node_test.test)("new LanguageString()", () => {
|
|
9
9
|
const langStr = new require_langstr.LanguageString("Hello", "en");
|
package/dist/tests/link.test.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require("../chunk-
|
|
2
|
-
const require_multibase = require("../multibase-
|
|
1
|
+
require("../chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_multibase = require("../multibase-Bz_UUDtL.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
//#region src/multibase/multibase.test.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as decodeText, i as names, n as encodeMultibase, o as encodeText, r as codes, t as decodeMultibase } from "../multibase-
|
|
1
|
+
import { a as decodeText, i as names, n as encodeMultibase, o as encodeText, r as codes, t as decodeMultibase } from "../multibase-B4bvakyA.mjs";
|
|
2
2
|
import { deepStrictEqual } from "node:assert";
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
//#region src/multibase/multibase.test.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
let _multiformats_base_x = require("@multiformats/base-x");
|
|
3
|
-
_multiformats_base_x = require_chunk.__toESM(_multiformats_base_x);
|
|
3
|
+
_multiformats_base_x = require_chunk.__toESM(_multiformats_base_x, 1);
|
|
4
4
|
//#region src/multibase/util.ts
|
|
5
5
|
const textDecoder = new TextDecoder();
|
|
6
6
|
const decodeText = (bytes) => textDecoder.decode(bytes);
|
|
@@ -21,6 +21,9 @@ function concat(arrs, length) {
|
|
|
21
21
|
* Class to encode/decode in the supported Bases
|
|
22
22
|
*/
|
|
23
23
|
var Base = class {
|
|
24
|
+
name;
|
|
25
|
+
code;
|
|
26
|
+
alphabet;
|
|
24
27
|
codeBuf;
|
|
25
28
|
codec;
|
|
26
29
|
constructor(name, code, factory, alphabet) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
let node_process = require("node:process");
|
|
3
|
-
node_process = require_chunk.__toESM(node_process);
|
|
3
|
+
node_process = require_chunk.__toESM(node_process, 1);
|
|
4
4
|
//#region deno.json
|
|
5
5
|
var name = "@fedify/vocab-runtime";
|
|
6
|
-
var version = "2.3.0-dev.
|
|
6
|
+
var version = "2.3.0-dev.1079+36ac23d1";
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/request.ts
|
|
9
9
|
/**
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
2
|
-
const require_request = require("./request-
|
|
1
|
+
const require_chunk = require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_request = require("./request-D1_CJkbx.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
let node_process = require("node:process");
|
|
6
|
-
node_process = require_chunk.__toESM(node_process);
|
|
6
|
+
node_process = require_chunk.__toESM(node_process, 1);
|
|
7
7
|
//#region src/request.test.ts
|
|
8
8
|
(0, node_test.test)("getUserAgent()", () => {
|
|
9
9
|
if ("Deno" in globalThis) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as version, r as getUserAgent } from "./request-
|
|
1
|
+
import { o as version, r as getUserAgent } from "./request-C9WvvfOf.mjs";
|
|
2
2
|
import { deepStrictEqual } from "node:assert";
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
import process from "node:process";
|
|
@@ -14,8 +14,13 @@ async function validatePublicUrl(url) {
|
|
|
14
14
|
const parsed = new URL(url);
|
|
15
15
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") throw new UrlError(`Unsupported protocol: ${parsed.protocol}`);
|
|
16
16
|
let hostname = parsed.hostname;
|
|
17
|
-
if (hostname.startsWith("[") && hostname.endsWith("]")) hostname = hostname.
|
|
17
|
+
if (hostname.startsWith("[") && hostname.endsWith("]")) hostname = hostname.slice(1, -1);
|
|
18
18
|
if (hostname === "localhost") throw new UrlError("Localhost is not allowed");
|
|
19
|
+
const hostnameFamily = isIP(hostname);
|
|
20
|
+
if (hostnameFamily !== 0) {
|
|
21
|
+
validatePublicIpAddress(hostname, hostnameFamily);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
19
24
|
if ("Deno" in globalThis && !isIP(hostname)) {
|
|
20
25
|
if ((await Deno.permissions.query({ name: "net" })).state !== "granted") return;
|
|
21
26
|
}
|
|
@@ -29,7 +34,11 @@ async function validatePublicUrl(url) {
|
|
|
29
34
|
} catch {
|
|
30
35
|
addresses = [];
|
|
31
36
|
}
|
|
32
|
-
for (const { address, family } of addresses)
|
|
37
|
+
for (const { address, family } of addresses) validatePublicIpAddress(address, family);
|
|
38
|
+
}
|
|
39
|
+
function validatePublicIpAddress(address, family) {
|
|
40
|
+
if (family === 4 && isValidPublicIPv4Address(address) || family === 6 && isValidPublicIPv6Address(address)) return;
|
|
41
|
+
throw new UrlError(`Invalid or private address: ${address}`);
|
|
33
42
|
}
|
|
34
43
|
function isValidPublicIPv4Address(address) {
|
|
35
44
|
const parts = address.split(".");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require("./chunk-
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
2
|
let node_dns_promises = require("node:dns/promises");
|
|
3
3
|
let node_net = require("node:net");
|
|
4
4
|
//#region src/url.ts
|
|
@@ -15,8 +15,13 @@ async function validatePublicUrl(url) {
|
|
|
15
15
|
const parsed = new URL(url);
|
|
16
16
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") throw new UrlError(`Unsupported protocol: ${parsed.protocol}`);
|
|
17
17
|
let hostname = parsed.hostname;
|
|
18
|
-
if (hostname.startsWith("[") && hostname.endsWith("]")) hostname = hostname.
|
|
18
|
+
if (hostname.startsWith("[") && hostname.endsWith("]")) hostname = hostname.slice(1, -1);
|
|
19
19
|
if (hostname === "localhost") throw new UrlError("Localhost is not allowed");
|
|
20
|
+
const hostnameFamily = (0, node_net.isIP)(hostname);
|
|
21
|
+
if (hostnameFamily !== 0) {
|
|
22
|
+
validatePublicIpAddress(hostname, hostnameFamily);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
20
25
|
if ("Deno" in globalThis && !(0, node_net.isIP)(hostname)) {
|
|
21
26
|
if ((await Deno.permissions.query({ name: "net" })).state !== "granted") return;
|
|
22
27
|
}
|
|
@@ -30,7 +35,11 @@ async function validatePublicUrl(url) {
|
|
|
30
35
|
} catch {
|
|
31
36
|
addresses = [];
|
|
32
37
|
}
|
|
33
|
-
for (const { address, family } of addresses)
|
|
38
|
+
for (const { address, family } of addresses) validatePublicIpAddress(address, family);
|
|
39
|
+
}
|
|
40
|
+
function validatePublicIpAddress(address, family) {
|
|
41
|
+
if (family === 4 && isValidPublicIPv4Address(address) || family === 6 && isValidPublicIPv6Address(address)) return;
|
|
42
|
+
throw new UrlError(`Invalid or private address: ${address}`);
|
|
34
43
|
}
|
|
35
44
|
function isValidPublicIPv4Address(address) {
|
|
36
45
|
const parts = address.split(".");
|
package/dist/tests/url.test.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require("./chunk-
|
|
2
|
-
const require_url = require("./url-
|
|
1
|
+
require("./chunk-C2EiDwsr.cjs");
|
|
2
|
+
const require_url = require("./url-CEmGms8t.cjs");
|
|
3
3
|
let node_assert = require("node:assert");
|
|
4
4
|
let node_test = require("node:test");
|
|
5
5
|
//#region src/url.test.ts
|
|
@@ -9,6 +9,8 @@ let node_test = require("node:test");
|
|
|
9
9
|
await (0, node_assert.rejects)(() => require_url.validatePublicUrl("https://localhost"), require_url.UrlError);
|
|
10
10
|
await (0, node_assert.rejects)(() => require_url.validatePublicUrl("https://127.0.0.1"), require_url.UrlError);
|
|
11
11
|
await (0, node_assert.rejects)(() => require_url.validatePublicUrl("https://[::1]"), require_url.UrlError);
|
|
12
|
+
await (0, node_assert.rejects)(() => require_url.validatePublicUrl("http://[::ffff:7f00:1]/"), require_url.UrlError);
|
|
13
|
+
await require_url.validatePublicUrl("https://[2001:db8::1]");
|
|
12
14
|
});
|
|
13
15
|
(0, node_test.test)("isValidPublicIPv4Address()", () => {
|
|
14
16
|
(0, node_assert.ok)(require_url.isValidPublicIPv4Address("8.8.8.8"));
|
|
@@ -25,6 +27,7 @@ let node_test = require("node:test");
|
|
|
25
27
|
(0, node_assert.ok)(!require_url.isValidPublicIPv6Address("fe80::1"));
|
|
26
28
|
(0, node_assert.ok)(!require_url.isValidPublicIPv6Address("ff00::1"));
|
|
27
29
|
(0, node_assert.ok)(!require_url.isValidPublicIPv6Address("::"));
|
|
30
|
+
(0, node_assert.ok)(!require_url.isValidPublicIPv6Address("::ffff:7f00:1"));
|
|
28
31
|
});
|
|
29
32
|
(0, node_test.test)("expandIPv6Address()", () => {
|
|
30
33
|
(0, node_assert.deepStrictEqual)(require_url.expandIPv6Address("::"), "0000:0000:0000:0000:0000:0000:0000:0000");
|
package/dist/tests/url.test.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as validatePublicUrl, i as isValidPublicIPv6Address, n as expandIPv6Address, r as isValidPublicIPv4Address, t as UrlError } from "./url-
|
|
1
|
+
import { a as validatePublicUrl, i as isValidPublicIPv6Address, n as expandIPv6Address, r as isValidPublicIPv4Address, t as UrlError } from "./url-BzGwIxB4.mjs";
|
|
2
2
|
import { deepStrictEqual, ok, rejects } from "node:assert";
|
|
3
3
|
import { test } from "node:test";
|
|
4
4
|
//#region src/url.test.ts
|
|
@@ -8,6 +8,8 @@ test("validatePublicUrl()", async () => {
|
|
|
8
8
|
await rejects(() => validatePublicUrl("https://localhost"), UrlError);
|
|
9
9
|
await rejects(() => validatePublicUrl("https://127.0.0.1"), UrlError);
|
|
10
10
|
await rejects(() => validatePublicUrl("https://[::1]"), UrlError);
|
|
11
|
+
await rejects(() => validatePublicUrl("http://[::ffff:7f00:1]/"), UrlError);
|
|
12
|
+
await validatePublicUrl("https://[2001:db8::1]");
|
|
11
13
|
});
|
|
12
14
|
test("isValidPublicIPv4Address()", () => {
|
|
13
15
|
ok(isValidPublicIPv4Address("8.8.8.8"));
|
|
@@ -24,6 +26,7 @@ test("isValidPublicIPv6Address()", () => {
|
|
|
24
26
|
ok(!isValidPublicIPv6Address("fe80::1"));
|
|
25
27
|
ok(!isValidPublicIPv6Address("ff00::1"));
|
|
26
28
|
ok(!isValidPublicIPv6Address("::"));
|
|
29
|
+
ok(!isValidPublicIPv6Address("::ffff:7f00:1"));
|
|
27
30
|
});
|
|
28
31
|
test("expandIPv6Address()", () => {
|
|
29
32
|
deepStrictEqual(expandIPv6Address("::"), "0000:0000:0000:0000:0000:0000:0000:0000");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/vocab-runtime",
|
|
3
|
-
"version": "2.3.0-dev.
|
|
3
|
+
"version": "2.3.0-dev.1079+36ac23d1",
|
|
4
4
|
"homepage": "https://fedify.dev/",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -61,14 +61,14 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/node": "^24.2.1",
|
|
63
63
|
"fetch-mock": "^12.5.4",
|
|
64
|
-
"tsdown": "^0.
|
|
64
|
+
"tsdown": "^0.22.0",
|
|
65
65
|
"typescript": "^5.9.2"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@logtape/logtape": "^2.0.
|
|
68
|
+
"@logtape/logtape": "^2.0.7",
|
|
69
69
|
"@multiformats/base-x": "^4.0.1",
|
|
70
|
-
"@opentelemetry/api": "^1.9.
|
|
71
|
-
"asn1js": "^3.0.
|
|
70
|
+
"@opentelemetry/api": "^1.9.1",
|
|
71
|
+
"asn1js": "^3.0.10",
|
|
72
72
|
"byte-encodings": "^1.0.11",
|
|
73
73
|
"jsonld": "^9.0.0",
|
|
74
74
|
"pkijs": "^3.3.3"
|
package/src/url.test.ts
CHANGED
|
@@ -19,6 +19,11 @@ test("validatePublicUrl()", async () => {
|
|
|
19
19
|
await rejects(() => validatePublicUrl("https://localhost"), UrlError);
|
|
20
20
|
await rejects(() => validatePublicUrl("https://127.0.0.1"), UrlError);
|
|
21
21
|
await rejects(() => validatePublicUrl("https://[::1]"), UrlError);
|
|
22
|
+
await rejects(
|
|
23
|
+
() => validatePublicUrl("http://[::ffff:7f00:1]/"),
|
|
24
|
+
UrlError,
|
|
25
|
+
);
|
|
26
|
+
await validatePublicUrl("https://[2001:db8::1]");
|
|
22
27
|
});
|
|
23
28
|
|
|
24
29
|
test("isValidPublicIPv4Address()", () => {
|
|
@@ -37,6 +42,7 @@ test("isValidPublicIPv6Address()", () => {
|
|
|
37
42
|
ok(!isValidPublicIPv6Address("fe80::1")); // link-local
|
|
38
43
|
ok(!isValidPublicIPv6Address("ff00::1")); // multicast
|
|
39
44
|
ok(!isValidPublicIPv6Address("::")); // unspecified
|
|
45
|
+
ok(!isValidPublicIPv6Address("::ffff:7f00:1")); // IPv4-mapped
|
|
40
46
|
});
|
|
41
47
|
|
|
42
48
|
test("expandIPv6Address()", () => {
|
package/src/url.ts
CHANGED
|
@@ -19,11 +19,16 @@ export async function validatePublicUrl(url: string): Promise<void> {
|
|
|
19
19
|
}
|
|
20
20
|
let hostname = parsed.hostname;
|
|
21
21
|
if (hostname.startsWith("[") && hostname.endsWith("]")) {
|
|
22
|
-
hostname = hostname.
|
|
22
|
+
hostname = hostname.slice(1, -1);
|
|
23
23
|
}
|
|
24
24
|
if (hostname === "localhost") {
|
|
25
25
|
throw new UrlError("Localhost is not allowed");
|
|
26
26
|
}
|
|
27
|
+
const hostnameFamily = isIP(hostname);
|
|
28
|
+
if (hostnameFamily !== 0) {
|
|
29
|
+
validatePublicIpAddress(hostname, hostnameFamily);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
27
32
|
if ("Deno" in globalThis && !isIP(hostname)) {
|
|
28
33
|
// If the `net` permission is not granted, we can't resolve the hostname.
|
|
29
34
|
// However, we can safely assume that it cannot gain access to private
|
|
@@ -50,14 +55,18 @@ export async function validatePublicUrl(url: string): Promise<void> {
|
|
|
50
55
|
addresses = [];
|
|
51
56
|
}
|
|
52
57
|
for (const { address, family } of addresses) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
validatePublicIpAddress(address, family);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function validatePublicIpAddress(address: string, family: number): void {
|
|
63
|
+
if (
|
|
64
|
+
family === 4 && isValidPublicIPv4Address(address) ||
|
|
65
|
+
family === 6 && isValidPublicIPv6Address(address)
|
|
66
|
+
) {
|
|
67
|
+
return;
|
|
60
68
|
}
|
|
69
|
+
throw new UrlError(`Invalid or private address: ${address}`);
|
|
61
70
|
}
|
|
62
71
|
|
|
63
72
|
export function isValidPublicIPv4Address(address: string): boolean {
|
package/tsdown.config.ts
CHANGED
|
@@ -8,7 +8,7 @@ export default [
|
|
|
8
8
|
dts: { compilerOptions: { isolatedDeclarations: true, declaration: true } },
|
|
9
9
|
format: ["esm", "cjs"],
|
|
10
10
|
platform: "neutral",
|
|
11
|
-
|
|
11
|
+
deps: { neverBundle: [/^node:/] },
|
|
12
12
|
}),
|
|
13
13
|
defineConfig({
|
|
14
14
|
outDir: "dist/tests",
|
|
@@ -16,6 +16,6 @@ export default [
|
|
|
16
16
|
.map((f) => f.replace(sep, "/")),
|
|
17
17
|
format: ["esm", "cjs"],
|
|
18
18
|
platform: "node",
|
|
19
|
-
|
|
19
|
+
deps: { neverBundle: [/^node:/, "@fedify/fixture"] },
|
|
20
20
|
}),
|
|
21
21
|
];
|