const packagePathnameFormat = /^\/((?:@[^/@]+\/)?[^/@]+)(?:@([^/]+))?(\/.*)?$/; export default function parsePackagePathname(pathname) { try { pathname = decodeURIComponent(pathname); } catch (error) { return null; } const match = packagePathnameFormat.exec(pathname); // Disallow invalid pathnames. if (match == null) return null; const packageName = match[1]; const packageVersion = match[2] || 'latest'; const filename = (match[3] || '').replace(/\/\/+/g, '/'); return { // If the pathname is /@scope/name@version/file.js: packageName, // @scope/name packageVersion, // version packageSpec: `${packageName}@${packageVersion}`, // @scope/name@version filename // /file.js }; }