Skip to content

Versioned API Keys

typescript
const queryKeys = createKeyFactory('api', {
  v1: {
    users: {
      all: () => [],
      detail: (params: { id: string }) => [params.id],
    },
    posts: {
      all: () => [],
      detail: (params: { id: string }) => [params.id],
    },
  },
  v2: {
    users: {
      all: () => [],
      detail: (params: { id: string }) => [params.id],
    },
  },
});

Usage

typescript
// Use version-specific keys
function UserDetailV1({ userId }: { userId: string }) {
  const { data } = useQuery({
    queryKey: queryKeys.v1.users.detail({ id: userId }),
    queryFn: () => fetchUserV1(userId),
  });
  // ...
}

function UserDetailV2({ userId }: { userId: string }) {
  const { data } = useQuery({
    queryKey: queryKeys.v2.users.detail({ id: userId }),
    queryFn: () => fetchUserV2(userId),
  });
  // ...
}

Migration Strategy

When migrating from v1 to v2:

typescript
// Invalidate v1 queries
queryClient.invalidateQueries({
  queryKey: queryKeys.v1(),
});

// Use v2 for new queries
useQuery({
  queryKey: queryKeys.v2.users.detail({ id: userId }),
  queryFn: () => fetchUserV2(userId),
});

Released under the MIT License.