diff --git a/packages/nitro/src/builders.ts b/packages/nitro/src/builders.ts index 3f8b62dc9..888399f7f 100644 --- a/packages/nitro/src/builders.ts +++ b/packages/nitro/src/builders.ts @@ -82,11 +82,14 @@ ${webhookRouteContent}`; } export function getWorkflowDirs(nitro: Nitro) { + const srcDir = nitro.options.srcDir || nitro.options.rootDir; + return unique( [ ...(nitro.options.workflow?.dirs ?? []), - join(nitro.options.rootDir, 'workflows'), - ...nitro.options.scanDirs.map((dir) => join(dir, 'workflows')), + join(srcDir, 'workflows'), + join(srcDir, nitro.options.routesDir || 'routes'), + join(srcDir, nitro.options.apiDir || 'api'), ].map((dir) => resolve(nitro.options.rootDir, dir)) ).sort(); } diff --git a/packages/nitro/test/dirs.test.ts b/packages/nitro/test/dirs.test.ts index 233f86b8a..b50270e8e 100644 --- a/packages/nitro/test/dirs.test.ts +++ b/packages/nitro/test/dirs.test.ts @@ -15,7 +15,7 @@ const nitroMock = (dirs: string[]) => { describe('nitro:getWorkflowDirs', () => { test('default dirs', () => { const result = getWorkflowDirs(nitroMock([])); - expect(result).toEqual(['/root/server/workflows', '/root/workflows']); + expect(result).toEqual(['/root/api', '/root/routes', '/root/workflows']); }); test('custom dirs', () => { @@ -24,8 +24,9 @@ describe('nitro:getWorkflowDirs', () => { ); expect(result).toEqual([ '/custom/dir2', + '/root/api', '/root/relative/dir1', - '/root/server/workflows', + '/root/routes', '/root/workflows', ]); }); diff --git a/packages/sveltekit/src/builder.ts b/packages/sveltekit/src/builder.ts index 23f6e808b..51b8efe2b 100644 --- a/packages/sveltekit/src/builder.ts +++ b/packages/sveltekit/src/builder.ts @@ -20,11 +20,16 @@ async function convertSvelteKitRequest(request) { export class SvelteKitBuilder extends BaseBuilder { constructor(config?: Partial) { const workingDir = config?.workingDir || process.cwd(); - const dirs = getWorkflowDirs({ dirs: config?.dirs }); + + // Merge user-provided dirs with framework defaults + // User dirs are included if provided, then framework defaults are added + const defaultDirs = ['workflows', 'src/workflows', 'routes', 'src/routes']; + const userDirs = config?.dirs ?? []; + const allDirs = Array.from(new Set([...userDirs, ...defaultDirs])); super({ ...config, - dirs, + dirs: allDirs, buildTarget: 'sveltekit' as const, stepsBundlePath: '', // unused in base workflowsBundlePath: '', // unused in base @@ -232,24 +237,3 @@ export const OPTIONS = createSvelteKitHandler('OPTIONS');` } } } - -/** - * Gets the list of directories to scan for workflow files. - */ -export function getWorkflowDirs(options?: { dirs?: string[] }): string[] { - return unique([ - // User-provided directories take precedence - ...(options?.dirs ?? []), - // Scan routes directories (like Next.js does with app/pages directories) - // This allows workflows to be placed anywhere in the routes tree - 'routes', - 'src/routes', - // Also scan dedicated workflow directories for organization - 'workflows', - 'src/workflows', - ]).sort(); -} - -function unique(array: T[]): T[] { - return Array.from(new Set(array)); -}