diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 4792e49bb..fe9158c91 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -411,6 +411,7 @@ export type OverrideOutputContentType = { export type NormalizedHonoOptions = { handlers?: string; validator: boolean | 'hono'; + validatorOutputPath: string; }; export type ZodOptions = { @@ -482,6 +483,7 @@ export type NormalizedZodOptions = { export type HonoOptions = { handlers?: string; validator?: boolean | 'hono'; + validatorOutputPath?: string; }; export type NormalizedQueryOptions = { diff --git a/packages/hono/src/index.ts b/packages/hono/src/index.ts index 69e85f8c4..ed5050d8c 100644 --- a/packages/hono/src/index.ts +++ b/packages/hono/src/index.ts @@ -160,6 +160,15 @@ ${currentValidator}async (c: ${contextTypeName}) => { );`; }; +const getValidatorOutputRelativePath = ( + validatorOutputPath: string, + handlerPath: string, +) => { + const { pathWithoutExtension } = getFileInfo(validatorOutputPath); + + return upath.relativeSafe(upath.dirname(handlerPath), pathWithoutExtension); +}; + const getZvalidatorImports = ( verbOption: GeneratorVerbOptions, isHonoValidator: boolean, @@ -266,7 +275,14 @@ const generateHandlers = async ( if (hasZValidator) { if (output.override.hono.validator === true) { - validatorImport = `\nimport { zValidator } from '${outputPath}.validator';`; + const validatorPath = output.override.hono.validatorOutputPath + ? getValidatorOutputRelativePath( + output.override.hono.validatorOutputPath, + handlerPath, + ) + : `${outputPath}.validator`; + + validatorImport = `\nimport { zValidator } from '${validatorPath}';`; } else if (output.override.hono.validator === 'hono') { validatorImport = `\nimport { zValidator } from '@hono/zod-validator';`; } @@ -352,10 +368,16 @@ ${getHonoHandlers({ const outputRelativePath = `./${kebab(tag)}`; let validatorImport = ''; - if (hasZValidator) { if (output.override.hono.validator === true) { - validatorImport = `\nimport { zValidator } from '${outputRelativePath}.validator';`; + const validatorPath = output.override.hono.validatorOutputPath + ? getValidatorOutputRelativePath( + output.override.hono.validatorOutputPath, + handlerPath, + ) + : `${outputRelativePath}.validator`; + + validatorImport = `\nimport { zValidator } from '${validatorPath}';`; } else if (output.override.hono.validator === 'hono') { validatorImport = `\nimport { zValidator } from '@hono/zod-validator';`; } @@ -450,7 +472,14 @@ const factory = createFactory();`; if (hasZValidator) { if (output.override.hono.validator === true) { - validatorImport = `\nimport { zValidator } from '${outputRelativePath}.validator';`; + const validatorPath = output.override.hono.validatorOutputPath + ? getValidatorOutputRelativePath( + output.override.hono.validatorOutputPath, + handlerPath, + ) + : `${outputRelativePath}.validator`; + + validatorImport = `\nimport { zValidator } from '${validatorPath}';`; } else if (output.override.hono.validator === 'hono') { validatorImport = `\nimport { zValidator } from '@hono/zod-validator';`; } @@ -775,7 +804,6 @@ const generateZvalidator = ( context.specs[context.specKey].info, ); - const { extension, dirname, filename } = getFileInfo(output.target); const content = ` // based on https://github.com/honojs/middleware/blob/main/packages/zod-validator/src/index.ts import type { z, ZodSchema, ZodError } from 'zod'; @@ -916,10 +944,12 @@ export const zValidator = }; `; - const validatorPath = upath.join( - dirname, - `${filename}.validator${extension}`, - ); + let validatorPath = output.override.hono.validatorOutputPath; + if (!output.override.hono.validatorOutputPath) { + const { extension, dirname, filename } = getFileInfo(output.target); + + validatorPath = upath.join(dirname, `${filename}.validator${extension}`); + } return { content: `${header}${content}`, diff --git a/packages/orval/src/utils/options.ts b/packages/orval/src/utils/options.ts index e2f5c6aee..4a6542467 100644 --- a/packages/orval/src/utils/options.ts +++ b/packages/orval/src/utils/options.ts @@ -583,6 +583,9 @@ const normalizeHonoOptions = ( ? { handlers: upath.resolve(workspace, hono.handlers) } : {}), validator: hono.validator ?? true, + validatorOutputPath: hono.validatorOutputPath + ? upath.resolve(workspace, hono.validatorOutputPath) + : '', }; };