diff --git a/.changeset/tall-lions-grin.md b/.changeset/tall-lions-grin.md new file mode 100644 index 000000000..7ce07fd67 --- /dev/null +++ b/.changeset/tall-lions-grin.md @@ -0,0 +1,5 @@ +--- +'vercel': patch +--- + +[cli] Fix error message when token is invalid diff --git a/packages/cli/src/util/projects/link.ts b/packages/cli/src/util/projects/link.ts index 60ab1a83b..3d5a24887 100644 --- a/packages/cli/src/util/projects/link.ts +++ b/packages/cli/src/util/projects/link.ts @@ -246,7 +246,7 @@ export async function getLinkedProject( if (isAPIError(err) && err.status === 403) { output.stopSpinner(); - if (err.missingToken) { + if (err.missingToken || err.invalidToken) { throw new InvalidToken(); } else { throw new NowBuildError({ diff --git a/packages/cli/test/mocks/team.ts b/packages/cli/test/mocks/team.ts index 45e9783e5..2b6add44f 100644 --- a/packages/cli/test/mocks/team.ts +++ b/packages/cli/test/mocks/team.ts @@ -5,9 +5,11 @@ export function useTeams( teamId?: string, options: { failMissingToken?: boolean; + failInvalidToken?: boolean; failNoAccess?: boolean; } = { failMissingToken: false, + failInvalidToken: false, failNoAccess: false, } ) { @@ -34,6 +36,15 @@ export function useTeams( }); return; } + if (options.failInvalidToken) { + res.statusCode = 403; + res.json({ + message: 'Not authorized', + code: 'forbidden', + invalidToken: true, + }); + return; + } if (options.failNoAccess) { res.statusCode = 403; diff --git a/packages/cli/test/unit/util/projects/link.test.ts b/packages/cli/test/unit/util/projects/link.test.ts index 029a97d76..6b0d5ff97 100644 --- a/packages/cli/test/unit/util/projects/link.test.ts +++ b/packages/cli/test/unit/util/projects/link.test.ts @@ -41,6 +41,35 @@ describe('getLinkedProject', () => { ); }); + it('should fail to return a link when token is invalid', async () => { + const cwd = fixture('vercel-pull-next'); + + useUser(); + useTeams('team_dummy', { failInvalidToken: true }); + useProject({ + ...defaultProject, + id: 'vercel-pull-next', + name: 'vercel-pull-next', + }); + + let link: UnPromisify> | undefined; + let error: Error | undefined; + try { + link = await getLinkedProject(client, cwd); + } catch (err) { + error = err as Error; + } + + expect(link).toBeUndefined(); + + if (!error) { + throw new Error(`Expected an error to be thrown.`); + } + expect(error.message).toBe( + 'The specified token is not valid. Use `vercel login` to generate a new token.' + ); + }); + it('should fail to return a link when no access to team', async () => { const cwd = fixture('vercel-pull-next');