Skip to content

Commit 0618c9b

Browse files
committed
Bundle @std/semver
1 parent e3cf8b3 commit 0618c9b

9 files changed

Lines changed: 383 additions & 14 deletions

File tree

cli/deno.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"@jimp/wasm-webp": "npm:@jimp/wasm-webp@^1.6.0",
1616
"@poppanator/http-constants": "npm:@poppanator/http-constants@^1.1.1",
1717
"@std/dotenv": "jsr:@std/dotenv@^0.225.2",
18+
"@std/semver": "jsr:@std/semver@^1.0.5",
1819
"cli-highlight": "npm:cli-highlight@^2.1.11",
1920
"hono": "jsr:@hono/hono@^4.5.9",
2021
"icojs": "npm:icojs@^0.19.4",

deno.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
"@multiformats/base-x": "npm:@multiformats/base-x@^4.0.1",
1111
"@std/fs": "jsr:@std/fs@^1.0.3",
1212
"@std/path": "jsr:@std/path@^1.0.6",
13-
"@std/semver": "jsr:@std/semver@^1.0.3",
1413
"preact": "npm:preact@10.19.6"
1514
},
1615
"unstable": [

fedify/federation/builder.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { assertEquals, assertExists } from "@std/assert";
2-
import { parse } from "@std/semver";
2+
import { parseSemVer } from "../nodeinfo/semver.ts";
33
import type { Protocol } from "../nodeinfo/types.ts";
44
import { test } from "../testing/mod.ts";
55
import { Activity, Note, Person } from "../vocab/vocab.ts";
@@ -46,7 +46,7 @@ test("FederationBuilder", async (t) => {
4646
version: "2.1",
4747
software: {
4848
name: "test",
49-
version: parse("1.0.0"),
49+
version: parseSemVer("1.0.0"),
5050
},
5151
protocols: ["activitypub"] as Protocol[],
5252
services: { inbound: [], outbound: [] },

fedify/nodeinfo/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { getLogger } from "@logtape/logtape";
2-
import { parse, type SemVer } from "@std/semver";
32
import {
43
getUserAgent,
54
type GetUserAgentOptions,
65
} from "../runtime/docloader.ts";
76
import type { ResourceDescriptor } from "../webfinger/jrd.ts";
7+
import { parseSemVer, type SemVer } from "./semver.ts";
88
import type {
99
InboundService,
1010
JsonValue,
@@ -268,7 +268,7 @@ export function parseSoftware(
268268
let version: SemVer;
269269
if ("version" in data && typeof data.version === "string") {
270270
try {
271-
version = parse(data.version);
271+
version = parseSemVer(data.version);
272272
} catch {
273273
if (!options.tryBestEffort) return null;
274274
version = { major: 0, minor: 0, patch: 0, build: [], prerelease: [] };

fedify/nodeinfo/handler.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { assertEquals } from "@std/assert";
2-
import { parse } from "@std/semver";
32
import type { NodeInfoDispatcher } from "../federation/callback.ts";
43
import { createRequestContext } from "../testing/context.ts";
54
import { test } from "../testing/mod.ts";
65
import { handleNodeInfo, handleNodeInfoJrd } from "./handler.ts";
6+
import { parseSemVer } from "./semver.ts";
77

88
test("handleNodeInfo()", async () => {
99
const request = new Request("https://example.com/nodeinfo/2.1");
@@ -15,7 +15,7 @@ test("handleNodeInfo()", async () => {
1515
const nodeInfoDispatcher: NodeInfoDispatcher<void> = (_ctx) => ({
1616
software: {
1717
name: "test",
18-
version: parse("1.2.3"),
18+
version: parseSemVer("1.2.3"),
1919
},
2020
protocols: ["activitypub"],
2121
usage: {

fedify/nodeinfo/mod.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
* @module
66
* @since 0.2.0
77
*/
8-
export {
9-
format as formatSemVer,
10-
parse as parseSemVer,
11-
type SemVer,
12-
} from "@std/semver";
8+
export { formatSemVer, parseSemVer, type SemVer } from "./semver.ts";
139
export {
1410
getNodeInfo,
1511
type GetNodeInfoOptions,

fedify/nodeinfo/semver.test.ts

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
import { assertEquals, assertThrows } from "@std/assert";
2+
import { test } from "../testing/mod.ts";
3+
import { formatSemVer, parseSemVer } from "./semver.ts";
4+
5+
test("parseSemVer() handles major", async (t) => {
6+
// [range, version]
7+
// Version should be detectable despite extra characters
8+
const versions: [string, number][] = [
9+
["1.2.3", 1],
10+
[" 1.2.3 ", 1],
11+
[" 2.2.3-4 ", 2],
12+
[" 3.2.3-pre ", 3],
13+
["v5.2.3", 5],
14+
[" v8.2.3 ", 8],
15+
["\t13.2.3", 13],
16+
];
17+
18+
for (const [v, expected] of versions) {
19+
await t.step(v, () => {
20+
const version = parseSemVer(v);
21+
assertEquals(version.major, expected);
22+
});
23+
}
24+
});
25+
26+
test("parseSemVer() handles minor", async (t) => {
27+
// [range, version]
28+
// Version should be detectable despite extra characters
29+
const versions: [string, number][] = [
30+
["1.1.3", 1],
31+
[" 1.1.3 ", 1],
32+
[" 1.2.3-4 ", 2],
33+
[" 1.3.3-pre ", 3],
34+
["v1.5.3", 5],
35+
[" v1.8.3 ", 8],
36+
["\t1.13.3", 13],
37+
];
38+
39+
for (const [v, expected] of versions) {
40+
await t.step(v, () => {
41+
const version = parseSemVer(v);
42+
assertEquals(version.minor, expected);
43+
});
44+
}
45+
});
46+
47+
test("parseSemVer() handles patch", async (t) => {
48+
// [range, version]
49+
// Version should be detectable despite extra characters
50+
const versions: [string, number][] = [
51+
["1.2.1", 1],
52+
[" 1.2.1 ", 1],
53+
[" 1.2.2-4 ", 2],
54+
[" 1.2.3-pre ", 3],
55+
["v1.2.5", 5],
56+
[" v1.2.8 ", 8],
57+
["\t1.2.13", 13],
58+
];
59+
for (const [v, expected] of versions) {
60+
await t.step(v, () => {
61+
const semver = parseSemVer(v);
62+
const actual = semver.patch;
63+
assertEquals(actual, expected);
64+
});
65+
}
66+
});
67+
68+
test("parseSemVer() handles prerelease", async (t) => {
69+
// [prereleaseParts, version]
70+
const versions: [string, (string | number)[]][] = [
71+
["1.2.2-alpha.1", ["alpha", 1]],
72+
["0.6.1-1", [1]],
73+
["1.0.0-beta.2", ["beta", 2]],
74+
["v0.5.4-pre", ["pre"]],
75+
["1.2.2-alpha.1", ["alpha", 1]],
76+
["1.2.0-1b3-4", ["1b3-4"]],
77+
["1.2.0-3.6-pre2", [3, "6-pre2"]],
78+
["2.0.0", []],
79+
];
80+
81+
for (const [v, expected] of versions) {
82+
await t.step(`${v} : ${JSON.stringify(expected)}`, () => {
83+
const semver = parseSemVer(v);
84+
assertEquals(
85+
semver.prerelease,
86+
expected,
87+
);
88+
});
89+
}
90+
});
91+
92+
test({
93+
name: "parseSemVer() throws on bad versions",
94+
fn: async (t) => {
95+
const versions: [unknown][] = [
96+
["1.2." + new Array(256).join("1")], // too long
97+
["1.2." + new Array(100).join("1")], // too big
98+
[null],
99+
[undefined],
100+
[{}],
101+
[[]],
102+
[false],
103+
[true],
104+
[0],
105+
[""],
106+
["not a version"],
107+
["∞.∞.∞"],
108+
["NaN.NaN.NaN"],
109+
];
110+
for (const [v] of versions) {
111+
await t.step(`${JSON.stringify(v)}`, () => {
112+
assertThrows(() => parseSemVer(v as string));
113+
});
114+
}
115+
},
116+
});
117+
118+
test("parseSemVer() throws on invalid versions", async (t) => {
119+
const versions = ["1.2.3.4", "NOT VALID", 1.2, null, "Infinity.NaN.Infinity"];
120+
121+
for (const v of versions) {
122+
await t.step(`invalid ${v}`, () => {
123+
assertThrows(
124+
function () {
125+
parseSemVer(v as string);
126+
},
127+
TypeError,
128+
);
129+
});
130+
}
131+
});
132+
133+
test("parseSemVer() handles big numeric prerelease", function () {
134+
const r = parseSemVer(`1.2.3-beta.${Number.MAX_SAFE_INTEGER}0`);
135+
assertEquals(r.prerelease, ["beta", "90071992547409910"]);
136+
});
137+
138+
test("formatSemVer()", async (t) => {
139+
const versions: [string, string][] = [
140+
["0.0.0", "0.0.0"],
141+
["1.2.3", "1.2.3"],
142+
["1.2.3-pre", "1.2.3-pre"],
143+
["1.2.3-pre.0", "1.2.3-pre.0"],
144+
["1.2.3+b", "1.2.3+b"],
145+
["1.2.3+b.0", "1.2.3+b.0"],
146+
["1.2.3-pre.0+b.0", "1.2.3-pre.0+b.0"],
147+
];
148+
149+
for (const [version, expected] of versions) {
150+
await t.step({
151+
name: version,
152+
fn: () => {
153+
const v = parseSemVer(version)!;
154+
const actual = formatSemVer(v);
155+
assertEquals(actual, expected);
156+
},
157+
});
158+
}
159+
});

0 commit comments

Comments
 (0)