diff --git a/web/shared/src/internal_url.js b/web/shared/src/internal_url.ts similarity index 51% rename from web/shared/src/internal_url.js rename to web/shared/src/internal_url.ts index 45c51485fb..d1d0cf978b 100644 --- a/web/shared/src/internal_url.js +++ b/web/shared/src/internal_url.ts @@ -1,3 +1,5 @@ +type MaybeGetStreamName = (id: number) => string | undefined; + const hashReplacements = new Map([ ["%", "."], ["(", ".28"], @@ -8,11 +10,11 @@ const hashReplacements = new Map([ // Some browsers zealously URI-decode the contents of // window.location.hash. So we hide our URI-encoding // by replacing % with . (like MediaWiki). -export function encodeHashComponent(str) { - return encodeURIComponent(str).replace(/[%().]/g, (matched) => hashReplacements.get(matched)); +export function encodeHashComponent(str: string): string { + return encodeURIComponent(str).replace(/[%().]/g, (matched) => hashReplacements.get(matched)!); } -export function decodeHashComponent(str) { +export function decodeHashComponent(str: string): string { // This fails for URLs containing // foo.foo or foo%foo due to our fault in special handling // of such characters when encoding. This can also, @@ -21,8 +23,11 @@ export function decodeHashComponent(str) { return decodeURIComponent(str.replace(/\./g, "%")); } -export function stream_id_to_slug(stream_id, maybe_get_stream_name) { - let name = maybe_get_stream_name(stream_id) || "unknown"; +export function stream_id_to_slug( + stream_id: number, + maybe_get_stream_name: MaybeGetStreamName, +): string { + let name = maybe_get_stream_name(stream_id) ?? "unknown"; // The name part of the URL doesn't really matter, so we try to // make it pretty. @@ -31,10 +36,13 @@ export function stream_id_to_slug(stream_id, maybe_get_stream_name) { // browsers that don't have it. name = name.replace(/ /g, "-"); - return stream_id + "-" + name; + return `${stream_id}-${name}`; } -export function encode_stream_id(stream_id, maybe_get_stream_name) { +export function encode_stream_id( + stream_id: number, + maybe_get_stream_name: MaybeGetStreamName, +): string { // stream_id_to_slug appends the stream name, but it does not do the // URI encoding piece. const slug = stream_id_to_slug(stream_id, maybe_get_stream_name); @@ -42,15 +50,20 @@ export function encode_stream_id(stream_id, maybe_get_stream_name) { return encodeHashComponent(slug); } -export function by_stream_url(stream_id, maybe_get_stream_name) { - return "#narrow/stream/" + encode_stream_id(stream_id, maybe_get_stream_name); +export function by_stream_url( + stream_id: number, + maybe_get_stream_name: MaybeGetStreamName, +): string { + return `#narrow/stream/${encode_stream_id(stream_id, maybe_get_stream_name)}`; } -export function by_stream_topic_url(stream_id, topic, maybe_get_stream_name) { - return ( - "#narrow/stream/" + - encode_stream_id(stream_id, maybe_get_stream_name) + - "/topic/" + - encodeHashComponent(topic) - ); +export function by_stream_topic_url( + stream_id: number, + topic: string, + maybe_get_stream_name: MaybeGetStreamName, +): string { + return `#narrow/stream/${encode_stream_id( + stream_id, + maybe_get_stream_name, + )}/topic/${encodeHashComponent(topic)}`; }