Skip to content
Merged
2 changes: 2 additions & 0 deletions .changeset/ten-shirts-double.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
26 changes: 26 additions & 0 deletions packages/backend/src/tokens/__tests__/types.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { expectTypeOf, test } from 'vitest';

import type { GetAuthFn, MachineAuthObject, SessionAuthObject } from '../types';

test('infers the correct AuthObject type for each accepted token type', () => {
const request = new Request('https://example.com');

// Across our SDKs, we have a getAuth() function
const getAuth: GetAuthFn<Request> = (_request: any, _options: any) => {
return {} as any;
};

// Session token by default
expectTypeOf(getAuth(request)).toEqualTypeOf<SessionAuthObject>();

// Individual token types
expectTypeOf(getAuth(request, { acceptsToken: 'session_token' })).toEqualTypeOf<SessionAuthObject>();
expectTypeOf(getAuth(request, { acceptsToken: 'api_key' })).toEqualTypeOf<MachineAuthObject<'api_key'>>();
expectTypeOf(getAuth(request, { acceptsToken: 'machine_token' })).toEqualTypeOf<MachineAuthObject<'machine_token'>>();
expectTypeOf(getAuth(request, { acceptsToken: 'oauth_token' })).toEqualTypeOf<MachineAuthObject<'oauth_token'>>();

// Array of token types
expectTypeOf(getAuth(request, { acceptsToken: ['session_token', 'oauth_token'] })).toEqualTypeOf<
SessionAuthObject | MachineAuthObject<'oauth_token'>
>();
});
8 changes: 4 additions & 4 deletions packages/backend/src/tokens/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ export type InferAuthObjectFromTokenArray<
> = SessionTokenType extends T[number]
? T[number] extends SessionTokenType
? SessionType
: SessionType | (MachineType & { tokenType: T[number] })
: MachineType & { tokenType: T[number] };
: SessionType | (MachineType & { tokenType: Exclude<T[number], SessionTokenType> })
: MachineType & { tokenType: Exclude<T[number], SessionTokenType> };

/**
* Infers auth object type from a single token type.
Expand All @@ -174,11 +174,11 @@ export type InferAuthObjectFromToken<
T extends TokenType,
SessionType extends AuthObject,
MachineType extends AuthObject,
> = T extends SessionTokenType ? SessionType : MachineType & { tokenType: T };
> = T extends SessionTokenType ? SessionType : MachineType & { tokenType: Exclude<T, SessionTokenType> };

export type SessionAuthObject = SignedInAuthObject | SignedOutAuthObject;
export type MachineAuthObject<T extends TokenType> = (AuthenticatedMachineObject | UnauthenticatedMachineObject) & {
tokenType: T;
tokenType: Exclude<T, SessionTokenType>;
};

type AuthOptions = PendingSessionOptions & { acceptsToken?: AuthenticateRequestOptions['acceptsToken'] };
Expand Down
4 changes: 4 additions & 0 deletions packages/backend/vitest.config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ import { defineConfig } from 'vitest/config';
export default defineConfig({
plugins: [],
test: {
typecheck: {
enabled: true,
include: ['**/*.test.ts'],
},
coverage: {
provider: 'v8',
},
Expand Down
Loading