Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit bde51ae

Browse files
authored
Update linkify to 4.1.1 (#11132)
* Update linkify to 4.1.1 Fixes: element-hq/element-web#23806 * Empty commit to nudge CI * Remove obsolete `any` types * Allow hyphens in domainpart * Improve test name
1 parent 79a7b9a commit bde51ae

File tree

4 files changed

+84
-70
lines changed

4 files changed

+84
-70
lines changed

package.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@
8989
"is-ip": "^3.1.0",
9090
"jszip": "^3.7.0",
9191
"katex": "^0.16.0",
92-
"linkify-element": "4.0.0-beta.4",
93-
"linkify-react": "4.0.0-beta.4",
94-
"linkify-string": "4.0.0-beta.4",
95-
"linkifyjs": "4.0.0-beta.4",
92+
"linkify-element": "4.1.1",
93+
"linkify-react": "4.1.1",
94+
"linkify-string": "4.1.1",
95+
"linkifyjs": "4.1.1",
9696
"lodash": "^4.17.20",
9797
"maplibre-gl": "^2.0.0",
9898
"matrix-encrypt-attachment": "^1.0.3",

src/linkify-matrix.ts

+32-43
Original file line numberDiff line numberDiff line change
@@ -38,72 +38,63 @@ export enum Type {
3838
RoomAlias = "roomalias",
3939
}
4040

41-
// Linkify stuff doesn't type scanner/parser/utils properly :/
4241
function matrixOpaqueIdLinkifyParser({
4342
scanner,
4443
parser,
45-
utils,
4644
token,
4745
name,
4846
}: {
49-
scanner: any;
50-
parser: any;
51-
utils: any;
47+
scanner: linkifyjs.ScannerInit;
48+
parser: linkifyjs.ParserInit;
5249
token: "#" | "+" | "@";
5350
name: Type;
5451
}): void {
5552
const {
5653
DOT,
5754
// IPV4 necessity
5855
NUM,
59-
TLD,
6056
COLON,
6157
SYM,
6258
SLASH,
6359
EQUALS,
6460
HYPHEN,
6561
UNDERSCORE,
66-
// because 'localhost' is tokenised to the localhost token,
67-
// usernames @localhost:foo.com are otherwise not matched!
68-
LOCALHOST,
69-
domain,
7062
} = scanner.tokens;
7163

72-
const S_START = parser.start;
73-
const matrixSymbol = utils.createTokenClass(name, { isLink: true });
64+
// Contains NUM, WORD, UWORD, EMOJI, TLD, UTLD, SCHEME, SLASH_SCHEME and LOCALHOST plus custom protocols (e.g. "matrix")
65+
const { domain } = scanner.tokens.groups;
7466

75-
const localpartTokens = [domain, TLD, DOT, LOCALHOST, SYM, SLASH, EQUALS, UNDERSCORE, HYPHEN];
76-
const domainpartTokens = [domain, TLD, LOCALHOST, HYPHEN];
67+
// Tokens we need that are not contained in the domain group
68+
const additionalLocalpartTokens = [DOT, SYM, SLASH, EQUALS, UNDERSCORE, HYPHEN];
69+
const additionalDomainpartTokens = [HYPHEN];
7770

78-
const INITIAL_STATE = S_START.tt(token);
71+
const matrixToken = linkifyjs.createTokenClass(name, { isLink: true });
72+
const matrixTokenState = new linkifyjs.State(matrixToken) as any as linkifyjs.State<linkifyjs.MultiToken>; // linkify doesn't appear to type this correctly
7973

80-
const LOCALPART_STATE = INITIAL_STATE.tt(domain);
81-
for (const token of localpartTokens) {
82-
INITIAL_STATE.tt(token, LOCALPART_STATE);
83-
LOCALPART_STATE.tt(token, LOCALPART_STATE);
84-
}
85-
const LOCALPART_STATE_DOT = LOCALPART_STATE.tt(DOT);
86-
for (const token of localpartTokens) {
87-
LOCALPART_STATE_DOT.tt(token, LOCALPART_STATE);
88-
}
74+
const matrixTokenWithPort = linkifyjs.createTokenClass(name, { isLink: true });
75+
const matrixTokenWithPortState = new linkifyjs.State(
76+
matrixTokenWithPort,
77+
) as any as linkifyjs.State<linkifyjs.MultiToken>; // linkify doesn't appear to type this correctly
8978

90-
const DOMAINPART_STATE_DOT = LOCALPART_STATE.tt(COLON);
91-
const DOMAINPART_STATE = DOMAINPART_STATE_DOT.tt(domain);
92-
DOMAINPART_STATE.tt(DOT, DOMAINPART_STATE_DOT);
93-
for (const token of domainpartTokens) {
94-
DOMAINPART_STATE.tt(token, DOMAINPART_STATE);
95-
// we are done if we have a domain
96-
DOMAINPART_STATE.tt(token, matrixSymbol);
97-
}
98-
99-
// accept repeated TLDs (e.g .org.uk) but do not accept double dots: ..
100-
for (const token of domainpartTokens) {
101-
DOMAINPART_STATE_DOT.tt(token, DOMAINPART_STATE);
102-
}
79+
const INITIAL_STATE = parser.start.tt(token);
10380

104-
const PORT_STATE = DOMAINPART_STATE.tt(COLON);
81+
// Localpart
82+
const LOCALPART_STATE = new linkifyjs.State<linkifyjs.MultiToken>();
83+
INITIAL_STATE.ta(domain, LOCALPART_STATE);
84+
INITIAL_STATE.ta(additionalLocalpartTokens, LOCALPART_STATE);
85+
LOCALPART_STATE.ta(domain, LOCALPART_STATE);
86+
LOCALPART_STATE.ta(additionalLocalpartTokens, LOCALPART_STATE);
10587

106-
PORT_STATE.tt(NUM, matrixSymbol);
88+
// Domainpart
89+
const DOMAINPART_STATE_DOT = LOCALPART_STATE.tt(COLON);
90+
DOMAINPART_STATE_DOT.ta(domain, matrixTokenState);
91+
DOMAINPART_STATE_DOT.ta(additionalDomainpartTokens, matrixTokenState);
92+
matrixTokenState.ta(domain, matrixTokenState);
93+
matrixTokenState.ta(additionalDomainpartTokens, matrixTokenState);
94+
matrixTokenState.tt(DOT, DOMAINPART_STATE_DOT);
95+
96+
// Port suffixes
97+
matrixTokenState.tt(COLON).tt(NUM, matrixTokenWithPortState);
10798
}
10899

109100
function onUserClick(event: MouseEvent, userId: string): void {
@@ -231,23 +222,21 @@ export const options: Opts = {
231222
};
232223

233224
// Run the plugins
234-
registerPlugin(Type.RoomAlias, ({ scanner, parser, utils }: any) => {
225+
registerPlugin(Type.RoomAlias, ({ scanner, parser }) => {
235226
const token = scanner.tokens.POUND as "#";
236227
matrixOpaqueIdLinkifyParser({
237228
scanner,
238229
parser,
239-
utils,
240230
token,
241231
name: Type.RoomAlias,
242232
});
243233
});
244234

245-
registerPlugin(Type.UserId, ({ scanner, parser, utils }: any) => {
235+
registerPlugin(Type.UserId, ({ scanner, parser }) => {
246236
const token = scanner.tokens.AT as "@";
247237
matrixOpaqueIdLinkifyParser({
248238
scanner,
249239
parser,
250-
utils,
251240
token,
252241
name: Type.UserId,
253242
});

test/linkify-matrix-test.ts

+29-4
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,20 @@ describe("linkify-matrix", () => {
138138
},
139139
]);
140140
});
141+
it("properly parses " + char + "localhost:foo.com", () => {
142+
const test = char + "localhost:foo.com";
143+
const found = linkify.find(test);
144+
expect(found).toEqual([
145+
{
146+
href: char + "localhost:foo.com",
147+
type,
148+
value: char + "localhost:foo.com",
149+
start: 0,
150+
end: test.length,
151+
isLink: true,
152+
},
153+
]);
154+
});
141155
it("properly parses " + char + "foo:localhost", () => {
142156
const test = char + "foo:localhost";
143157
const found = linkify.find(test);
@@ -162,7 +176,6 @@ describe("linkify-matrix", () => {
162176
value: char + "foo:bar.com",
163177
start: 0,
164178
end: test.length,
165-
166179
isLink: true,
167180
},
168181
]);
@@ -219,7 +232,6 @@ describe("linkify-matrix", () => {
219232
href: char + "foo:bar.com",
220233
start: 0,
221234
end: test.length - ":".length,
222-
223235
isLink: true,
224236
},
225237
]);
@@ -238,6 +250,20 @@ describe("linkify-matrix", () => {
238250
},
239251
]);
240252
});
253+
it("ignores duplicate :NUM (double port specifier)", () => {
254+
const test = "" + char + "foo:bar.com:2225:1234";
255+
const found = linkify.find(test);
256+
expect(found).toEqual([
257+
{
258+
href: char + "foo:bar.com:2225",
259+
type,
260+
value: char + "foo:bar.com:2225",
261+
start: 0,
262+
end: 17,
263+
isLink: true,
264+
},
265+
]);
266+
});
241267
it("ignores all the trailing :", () => {
242268
const test = "" + char + "foo:bar.com::::";
243269
const found = linkify.find(test);
@@ -262,7 +288,6 @@ describe("linkify-matrix", () => {
262288
value: char + "foo.asdf:bar.com",
263289
start: 0,
264290
end: test.length - ":".repeat(4).length,
265-
266291
isLink: true,
267292
},
268293
]);
@@ -281,7 +306,7 @@ describe("linkify-matrix", () => {
281306
},
282307
]);
283308
});
284-
it("does not parse multiple room aliases in one string", () => {
309+
it("properly parses room alias with hyphen in domain part", () => {
285310
const test = "" + char + "foo:bar.com-baz.com";
286311
const found = linkify.find(test);
287312
expect(found).toEqual([

yarn.lock

+19-19
Original file line numberDiff line numberDiff line change
@@ -6333,25 +6333,25 @@ lines-and-columns@^1.1.6:
63336333
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
63346334
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
63356335

6336-
linkify-element@4.0.0-beta.4:
6337-
version "4.0.0-beta.4"
6338-
resolved "https://registry.yarnpkg.com/linkify-element/-/linkify-element-4.0.0-beta.4.tgz#31bb5dff7430c4debc34030466bd8f3e297793a7"
6339-
integrity sha512-dsu5qxk6MhQHxXUlPjul33JknQPx7Iv/N8zisH4JtV31qVk0qZg/5gn10Hr76GlMuixcdcxVvGHNfVcvbut13w==
6340-
6341-
linkify-react@4.0.0-beta.4:
6342-
version "4.0.0-beta.4"
6343-
resolved "https://registry.yarnpkg.com/linkify-react/-/linkify-react-4.0.0-beta.4.tgz#75311ade523a52d43054dd841d724d746d43f60d"
6344-
integrity sha512-o4vFe28vtk6i8a6tbtkLyusIyhLJSYoHC3gEpmJEVqi6Hy3aguVEenYmtaOjmAQehDrBYeHv9s4qcneZOf7SWQ==
6345-
6346-
linkify-string@4.0.0-beta.4:
6347-
version "4.0.0-beta.4"
6348-
resolved "https://registry.yarnpkg.com/linkify-string/-/linkify-string-4.0.0-beta.4.tgz#0982509bc6ce81c554bff8d7121057193b84ea32"
6349-
integrity sha512-1U90tclSloCMAhbcuu4S+BN7ZisZkFB6ggKS1ofdYy1bmtgxdXGDppVUV+qRp5rcAudla7K0LBgOiwCQ0WzrYQ==
6350-
6351-
linkifyjs@4.0.0-beta.4:
6352-
version "4.0.0-beta.4"
6353-
resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.0.0-beta.4.tgz#8a03e7a999ed0b578a14d690585a32706525c45e"
6354-
integrity sha512-j8IUYMqyTT0aDrrkA5kf4hn6QurSKjGiQbqjNr4qc8dwEXIniCGp0JrdXmsGcTOEyhKG03GyRnJjp3NDTBBPDQ==
6336+
linkify-element@4.1.1:
6337+
version "4.1.1"
6338+
resolved "https://registry.yarnpkg.com/linkify-element/-/linkify-element-4.1.1.tgz#049221d53250e67c053cd94dd0ef411cccb87b28"
6339+
integrity sha512-G//YNU6WXu1uo/oneLfGE6UPlz5cdk4M43l+WHPezdWUQ/B703g9CtvxtLgfNFU8a/9+c9XjI+d+vfQTiH+KHg==
6340+
6341+
linkify-react@4.1.1:
6342+
version "4.1.1"
6343+
resolved "https://registry.yarnpkg.com/linkify-react/-/linkify-react-4.1.1.tgz#79cc29c6e5c0fd660be74a6a51d25c1b36977cf7"
6344+
integrity sha512-2K9Y1cUdvq40dFWqCJ//X+WP19nlzIVITFGI93RjLnA0M7KbnxQ/ffC3AZIZaEIrLangF9Hjt3i0GQ9/anEG5A==
6345+
6346+
linkify-string@4.1.1:
6347+
version "4.1.1"
6348+
resolved "https://registry.yarnpkg.com/linkify-string/-/linkify-string-4.1.1.tgz#461eb30b66752dec21f3557ebe55983ae3f5b195"
6349+
integrity sha512-9+kj8xr7GLiyNyO9ri7lIxq2ixVYjjqvtomPQpeYNNT56/PxQq6utzXFLm8HxOaGTiMpimj1UAQWwYYPV88L1g==
6350+
6351+
linkifyjs@4.1.1:
6352+
version "4.1.1"
6353+
resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.1.tgz#73d427e3bbaaf4ca8e71c589ad4ffda11a9a5fde"
6354+
integrity sha512-zFN/CTVmbcVef+WaDXT63dNzzkfRBKT1j464NJQkV7iSgJU0sLBus9W0HBwnXK13/hf168pbrx/V/bjEHOXNHA==
63556355

63566356
listr2@^3.8.3:
63576357
version "3.14.0"

0 commit comments

Comments
 (0)