Merge pull request #33536 from jonkoops/fix/zod-schema-first-generics

fix: use schema-first generic pattern for Zod type compatibility
This commit is contained in:
Fredrik Adelöw
2026-03-26 17:16:51 +01:00
committed by GitHub
5 changed files with 56 additions and 37 deletions
+8 -14
View File
@@ -16,8 +16,8 @@ import { Profile } from 'passport';
import { Request as Request_2 } from 'express';
import { Response as Response_2 } from 'express';
import { Strategy } from 'passport';
import type { ZodSchema } from 'zod/v3';
import type { ZodTypeDef } from 'zod/v3';
import type { z } from 'zod/v3';
import type { ZodType } from 'zod/v3';
// @public (undocumented)
export interface AuthOwnershipResolutionExtensionPoint {
@@ -227,15 +227,10 @@ export function createProxyAuthRouteHandlers<TResult>(
// @public (undocumented)
export function createSignInResolverFactory<
TAuthResult,
TOptionsOutput,
TOptionsInput,
TSchema extends ZodType = ZodType<unknown>,
>(
options: SignInResolverFactoryOptions<
TAuthResult,
TOptionsOutput,
TOptionsInput
>,
): SignInResolverFactory<TAuthResult, TOptionsInput>;
options: SignInResolverFactoryOptions<TAuthResult, TSchema>,
): SignInResolverFactory<TAuthResult, z.input<TSchema>>;
// @public (undocumented)
export function decodeOAuthState(encodedState: string): OAuthState;
@@ -676,13 +671,12 @@ export interface SignInResolverFactory<TAuthResult = any, TOptions = any> {
// @public (undocumented)
export interface SignInResolverFactoryOptions<
TAuthResult,
TOptionsOutput,
TOptionsInput,
TSchema extends ZodType = ZodType<unknown>,
> {
// (undocumented)
create(options: TOptionsOutput): SignInResolver<TAuthResult>;
create(options: z.output<TSchema>): SignInResolver<TAuthResult>;
// (undocumented)
optionsSchema?: ZodSchema<TOptionsOutput, ZodTypeDef, TOptionsInput>;
optionsSchema?: TSchema;
}
// @public
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import type { ZodSchema, ZodTypeDef } from 'zod/v3';
import type { z, ZodType } from 'zod/v3';
import { SignInResolver } from '../types';
import zodToJsonSchema from 'zod-to-json-schema';
import { JsonObject } from '@backstage/types';
@@ -34,38 +34,32 @@ export interface SignInResolverFactory<TAuthResult = any, TOptions = any> {
/** @public */
export interface SignInResolverFactoryOptions<
TAuthResult,
TOptionsOutput,
TOptionsInput,
TSchema extends ZodType = ZodType<unknown>,
> {
optionsSchema?: ZodSchema<TOptionsOutput, ZodTypeDef, TOptionsInput>;
create(options: TOptionsOutput): SignInResolver<TAuthResult>;
optionsSchema?: TSchema;
create(options: z.output<TSchema>): SignInResolver<TAuthResult>;
}
/** @public */
export function createSignInResolverFactory<
TAuthResult,
TOptionsOutput,
TOptionsInput,
TSchema extends ZodType = ZodType<unknown>,
>(
options: SignInResolverFactoryOptions<
TAuthResult,
TOptionsOutput,
TOptionsInput
>,
): SignInResolverFactory<TAuthResult, TOptionsInput> {
options: SignInResolverFactoryOptions<TAuthResult, TSchema>,
): SignInResolverFactory<TAuthResult, z.input<TSchema>> {
const { optionsSchema } = options;
if (!optionsSchema) {
return (resolverOptions?: TOptionsInput) => {
return (resolverOptions?: z.input<TSchema>) => {
if (resolverOptions) {
throw new InputError('sign-in resolver does not accept options');
}
return options.create(undefined as TOptionsOutput);
return options.create(undefined);
};
}
const factory = (
...[resolverOptions]: undefined extends TOptionsInput
? [options?: TOptionsInput]
: [options: TOptionsInput]
...[resolverOptions]: undefined extends z.input<TSchema>
? [options?: z.input<TSchema>]
: [options: z.input<TSchema>]
) => {
let parsedOptions;
try {