diff --git a/src/constants.ts b/src/constants.ts index 5a12770..9caa8b8 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -20,7 +20,13 @@ export const isLoadingLocalReplit = baseUrl.includes('localhost'); export const isLoadingStagingReplit = baseUrl.includes('staging'); export const isLoadingProdReplit = baseUrl === defaultBaseUrl; -export const workspaceUrlRegex = /^\/@\S+\/\S+/; +// Generated using path-to-regexp, the same package express uses to parse routes. +// See: https://github.com/pillarjs/path-to-regexp +// Matches /@:username/:slug +export const personalReplUrlRegex = /^\/@([^/#?]+?)(?:\/([^/#?]+?))[/#?]?$/i; +// Matches /t/:orgSlug/:orgId/repls/:replSlug +export const teamReplUrlRegex = + /^\/t(?:\/([^/#?]+?))(?:\/([^/#?]+?))\/repls(?:\/([^/#?]+?))[/#?]?$/i; export const homePage = '/desktopApp/home'; export const authPage = '/desktopApp/auth'; diff --git a/src/createWindow.ts b/src/createWindow.ts index 241152e..d1c29b6 100644 --- a/src/createWindow.ts +++ b/src/createWindow.ts @@ -11,7 +11,8 @@ import { appName as title, baseUrl, preloadScript as preload, - workspaceUrlRegex, + teamReplUrlRegex, + personalReplUrlRegex, homePage, isProduction, } from './constants'; @@ -54,7 +55,10 @@ function setLastOpenRepl(url: string, lastOpenRepl: string | null) { return; } - if (!workspaceUrlRegex.test(u.pathname)) { + if ( + !personalReplUrlRegex.test(u.pathname) && + !teamReplUrlRegex.test(u.pathname) + ) { return; } diff --git a/src/deeplink.ts b/src/deeplink.ts index 8abe2bb..c9de88a 100644 --- a/src/deeplink.ts +++ b/src/deeplink.ts @@ -3,7 +3,8 @@ import { isWindows, isLinux } from './platform'; import { baseUrl, protocol, - workspaceUrlRegex, + personalReplUrlRegex, + teamReplUrlRegex, semverRegex, authPage, homePage, @@ -127,8 +128,8 @@ function handleNew(language: string) { } function handleRepl(url: string) { - if (!workspaceUrlRegex.test(url)) { - log.error('Expected URL of the format /@username/slug'); + if (!personalReplUrlRegex.test(url) && !teamReplUrlRegex.test(url)) { + log.error('Expected valid workspace URL'); return; } diff --git a/src/isSupportedPage.ts b/src/isSupportedPage.ts index 5a5f565..791b8f5 100644 --- a/src/isSupportedPage.ts +++ b/src/isSupportedPage.ts @@ -1,11 +1,16 @@ -import { desktopAppPrefix, workspaceUrlRegex } from './constants'; +import { + desktopAppPrefix, + personalReplUrlRegex, + teamReplUrlRegex, +} from './constants'; const supportedNonDesktopAppPages = ['logout']; export default function isSupportedPage(page: string): boolean { return ( page.startsWith(desktopAppPrefix) || - workspaceUrlRegex.test(page) || + personalReplUrlRegex.test(page) || + teamReplUrlRegex.test(page) || supportedNonDesktopAppPages.includes(page) ); }