diff --git a/packages/platform/src/lib/options.ts b/packages/platform/src/lib/options.ts index 83b8d87e..12990930 100644 --- a/packages/platform/src/lib/options.ts +++ b/packages/platform/src/lib/options.ts @@ -53,6 +53,12 @@ export interface Options { * Additional files to include in compilation */ include?: string[]; + /** + * Toggles internal API middleware. + * If disabled, a proxy request is used to route /api + * requests to / in the production server build. + */ + useAPIMiddleware?: boolean; } export interface PrerenderContentDir { diff --git a/packages/platform/src/lib/platform-plugin.spec.ts b/packages/platform/src/lib/platform-plugin.spec.ts index c1b8c532..0da58552 100644 --- a/packages/platform/src/lib/platform-plugin.spec.ts +++ b/packages/platform/src/lib/platform-plugin.spec.ts @@ -48,16 +48,4 @@ describe('platformPlugin', () => { expect(viteNitroPluginSpy).toHaveBeenCalledWith({ ssr: false }, undefined); expect(ssrBuildPluginSpy).not.toHaveBeenCalled(); }); - - it('should pass the custom endpoint as part of the nitro runtimeConfig if options.apiPrefix is set to false', async () => { - const customPrefix = 'custom-endpoint'; - const { viteNitroPluginSpy, platformPlugin } = await setup(); - platformPlugin({ apiPrefix: customPrefix }); - - expect(viteNitroPluginSpy).toHaveBeenCalledWith(expect.anything(), { - runtimeConfig: { - apiPrefix: customPrefix, - }, - }); - }); }); diff --git a/packages/platform/src/lib/platform-plugin.ts b/packages/platform/src/lib/platform-plugin.ts index 18b08bfc..ee40ee1f 100644 --- a/packages/platform/src/lib/platform-plugin.ts +++ b/packages/platform/src/lib/platform-plugin.ts @@ -12,20 +12,12 @@ import { depsPlugin } from './deps-plugin.js'; import { injectHTMLPlugin } from './ssr/inject-html-plugin.js'; export function platformPlugin(opts: Options = {}): Plugin[] { - const { apiPrefix, ...platformOptions } = { + const { ...platformOptions } = { ssr: true, ...opts, }; let nitroOptions = platformOptions?.nitro; - if (apiPrefix) { - nitroOptions = { - ...nitroOptions, - runtimeConfig: { - apiPrefix, - }, - }; - } return [ ...viteNitroPlugin(platformOptions, nitroOptions), diff --git a/packages/vite-plugin-nitro/src/lib/options.ts b/packages/vite-plugin-nitro/src/lib/options.ts index 8b070532..d250d3e2 100644 --- a/packages/vite-plugin-nitro/src/lib/options.ts +++ b/packages/vite-plugin-nitro/src/lib/options.ts @@ -19,6 +19,14 @@ export interface Options { * Additional API paths to include */ additionalAPIDirs?: string[]; + apiPrefix?: string; + + /** + * Toggles internal API middleware. + * If disabled, a proxy request is used to route /api + * requests to / in the production server build. + */ + useAPIMiddleware?: boolean; } export interface PrerenderOptions { diff --git a/packages/vite-plugin-nitro/src/lib/vite-nitro-plugin.spec.data.ts b/packages/vite-plugin-nitro/src/lib/vite-nitro-plugin.spec.data.ts index 9e2b356c..32145662 100644 --- a/packages/vite-plugin-nitro/src/lib/vite-nitro-plugin.spec.data.ts +++ b/packages/vite-plugin-nitro/src/lib/vite-nitro-plugin.spec.data.ts @@ -36,6 +36,7 @@ export const mockNitroConfig: NitroConfig = { }, ], }, + routeRules: undefined, }; export async function mockBuildFunctions() { diff --git a/packages/vite-plugin-nitro/src/lib/vite-plugin-nitro.ts b/packages/vite-plugin-nitro/src/lib/vite-plugin-nitro.ts index 1bf30427..51d50be3 100644 --- a/packages/vite-plugin-nitro/src/lib/vite-plugin-nitro.ts +++ b/packages/vite-plugin-nitro/src/lib/vite-plugin-nitro.ts @@ -30,7 +30,11 @@ const __dirname = dirname(__filename); export function nitro(options?: Options, nitroOptions?: NitroConfig): Plugin[] { const workspaceRoot = options?.workspaceRoot ?? process.cwd(); const isTest = process.env['NODE_ENV'] === 'test' || !!process.env['VITEST']; - const apiPrefix = `/${nitroOptions?.runtimeConfig?.['apiPrefix'] ?? 'api'}`; + const apiPrefix = `/${options?.apiPrefix || 'api'}`; + const useAPIMiddleware = + typeof options?.useAPIMiddleware !== 'undefined' + ? options?.useAPIMiddleware + : true; let isBuild = false; let isServe = false; @@ -120,12 +124,21 @@ export function nitro(options?: Options, nitroOptions?: NitroConfig): Plugin[] { plugins: [pageEndpointsPlugin()], }, handlers: [ - { - handler: apiMiddlewareHandler, - middleware: true, - }, + ...(useAPIMiddleware + ? [ + { + handler: apiMiddlewareHandler, + middleware: true, + }, + ] + : []), ...pageHandlers, ], + routeRules: useAPIMiddleware + ? undefined + : { + [`${apiPrefix}/**`]: { proxy: { to: '/**' } }, + }, }; if (isVercelPreset(buildPreset)) { @@ -260,10 +273,14 @@ export function nitro(options?: Options, nitroOptions?: NitroConfig): Plugin[] { }, moduleSideEffects: ['zone.js/node', 'zone.js/fesm2015/zone-node'], handlers: [ - { - handler: apiMiddlewareHandler, - middleware: true, - }, + ...(useAPIMiddleware + ? [ + { + handler: apiMiddlewareHandler, + middleware: true, + }, + ] + : []), ...pageHandlers, ], };