11import { promises as fsp } from "node:fs" ;
2- import { resolve } from "pathe" ;
2+ import { resolve , join , relative , basename } from "pathe" ;
33import { describe , expect , it } from "vitest" ;
44import { setupTest , startServer , testNitro } from "../tests" ;
5+ import { readlink } from "node:fs/promises" ;
56
67describe ( "nitro:preset:vercel" , async ( ) => {
78 const ctx = await setupTest ( "vercel" ) ;
@@ -113,7 +114,7 @@ describe("nitro:preset:vercel", async () => {
113114 "handle": "filesystem",
114115 },
115116 {
116- "dest": "/rules/_/noncached/cached?url=$url",
117+ "dest": "/rules/_/noncached/cached.isr ?url=$url",
117118 "src": "/rules/_/noncached/cached",
118119 },
119120 {
@@ -125,27 +126,27 @@ describe("nitro:preset:vercel", async () => {
125126 "src": "(?<url>/rules/_/noncached/.*)",
126127 },
127128 {
128- "dest": "/__fallback-- rules--- cached?url=$url",
129+ "dest": "/rules/_/ cached/[...].isr ?url=$url",
129130 "src": "(?<url>/rules/_/cached/.*)",
130131 },
131132 {
132133 "dest": "/__fallback",
133134 "src": "/rules/dynamic",
134135 },
135136 {
136- "dest": "/__fallback-- rules- isr?url=$url",
137+ "dest": "/rules/isr/[...]. isr?url=$url",
137138 "src": "(?<url>/rules/isr/.*)",
138139 },
139140 {
140- "dest": "/__fallback-- rules- isr-ttl?url=$url",
141+ "dest": "/rules/ isr-ttl/[...].isr ?url=$url",
141142 "src": "(?<url>/rules/isr-ttl/.*)",
142143 },
143144 {
144- "dest": "/__fallback-- rules- swr?url=$url",
145+ "dest": "/rules/ swr/[...].isr ?url=$url",
145146 "src": "(?<url>/rules/swr/.*)",
146147 },
147148 {
148- "dest": "/__fallback-- rules- swr-ttl?url=$url",
149+ "dest": "/rules/ swr-ttl/[...].isr ?url=$url",
149150 "src": "(?<url>/rules/swr-ttl/.*)",
150151 },
151152 {
@@ -450,7 +451,7 @@ describe("nitro:preset:vercel", async () => {
450451 const isrRouteConfig = await fsp . readFile (
451452 resolve (
452453 ctx . outDir ,
453- "functions/__fallback-- rules- isr.prerender-config.json"
454+ "functions/rules/isr/[...]. isr.prerender-config.json"
454455 ) ,
455456 "utf8"
456457 ) ;
@@ -459,6 +460,128 @@ describe("nitro:preset:vercel", async () => {
459460 allowQuery : [ "q" , "url" ] ,
460461 } ) ;
461462 } ) ;
463+
464+ const walkDir = async ( path : string ) : Promise < string [ ] > => {
465+ const items : string [ ] = [ ] ;
466+ const dirname = basename ( path ) ;
467+ const entries = await fsp . readdir ( path , { withFileTypes : true } ) ;
468+ for ( const entry of entries ) {
469+ if ( entry . isFile ( ) ) {
470+ items . push ( `${ dirname } /${ entry . name } ` ) ;
471+ } else if ( entry . isSymbolicLink ( ) ) {
472+ items . push ( `${ dirname } /${ entry . name } (symlink)` ) ;
473+ } else if ( / c h u n k s | n o d e _ m o d u l e s / . test ( entry . name ) ) {
474+ items . push ( `${ dirname } /${ entry . name } ` ) ;
475+ } else if ( entry . isDirectory ( ) ) {
476+ items . push (
477+ ...( await walkDir ( join ( path , entry . name ) ) ) . map (
478+ ( i ) => `${ dirname } /${ i } `
479+ )
480+ ) ;
481+ }
482+ }
483+ return items ;
484+ } ;
485+
486+ it ( "should generated expected functions" , async ( ) => {
487+ const functionsDir = resolve ( ctx . outDir , "functions" ) ;
488+ const functionsFiles = await walkDir ( functionsDir ) ;
489+ expect ( functionsFiles ) . toMatchInlineSnapshot ( `
490+ [
491+ "functions/500.func (symlink)",
492+ "functions/__fallback.func/.vc-config.json",
493+ "functions/__fallback.func/chunks",
494+ "functions/__fallback.func/index.mjs",
495+ "functions/__fallback.func/index.mjs.map",
496+ "functions/__fallback.func/node_modules",
497+ "functions/__fallback.func/package.json",
498+ "functions/__fallback.func/timing.js",
499+ "functions/_openapi.json.func (symlink)",
500+ "functions/_scalar.func (symlink)",
501+ "functions/_swagger.func (symlink)",
502+ "functions/api/cached.func (symlink)",
503+ "functions/api/db.func (symlink)",
504+ "functions/api/echo.func (symlink)",
505+ "functions/api/error.func (symlink)",
506+ "functions/api/errors.func (symlink)",
507+ "functions/api/headers.func (symlink)",
508+ "functions/api/hello.func (symlink)",
509+ "functions/api/hello2.func (symlink)",
510+ "functions/api/hey.func (symlink)",
511+ "functions/api/import-meta.func (symlink)",
512+ "functions/api/kebab.func (symlink)",
513+ "functions/api/meta/test.func (symlink)",
514+ "functions/api/methods/default.func (symlink)",
515+ "functions/api/methods/foo.get.func (symlink)",
516+ "functions/api/methods/get.func (symlink)",
517+ "functions/api/methods.func (symlink)",
518+ "functions/api/param/[test-id].func (symlink)",
519+ "functions/api/serialized/date.func (symlink)",
520+ "functions/api/serialized/error.func (symlink)",
521+ "functions/api/serialized/function.func (symlink)",
522+ "functions/api/serialized/map.func (symlink)",
523+ "functions/api/serialized/null.func (symlink)",
524+ "functions/api/serialized/set.func (symlink)",
525+ "functions/api/serialized/tuple.func (symlink)",
526+ "functions/api/serialized/void.func (symlink)",
527+ "functions/api/storage/dev.func (symlink)",
528+ "functions/api/storage/item.func (symlink)",
529+ "functions/api/test/[-]/foo.func (symlink)",
530+ "functions/api/typed/catchall/[slug]/[...another].func (symlink)",
531+ "functions/api/typed/catchall/some/[...test].func (symlink)",
532+ "functions/api/typed/todos/[...].func (symlink)",
533+ "functions/api/typed/todos/[todoId]/comments/[...commentId].func (symlink)",
534+ "functions/api/typed/user/[userId]/[userExtends].func (symlink)",
535+ "functions/api/typed/user/[userId]/post/[postId].func (symlink)",
536+ "functions/api/typed/user/[userId]/post/firstPost.func (symlink)",
537+ "functions/api/typed/user/[userId].func (symlink)",
538+ "functions/api/typed/user/john/[johnExtends].func (symlink)",
539+ "functions/api/typed/user/john/post/[postId].func (symlink)",
540+ "functions/api/typed/user/john/post/coffee.func (symlink)",
541+ "functions/api/typed/user/john.func (symlink)",
542+ "functions/api/upload.func (symlink)",
543+ "functions/api/wildcard/[...param].func (symlink)",
544+ "functions/assets/[id].func (symlink)",
545+ "functions/assets/all.func (symlink)",
546+ "functions/assets/md.func (symlink)",
547+ "functions/config.func (symlink)",
548+ "functions/context.func (symlink)",
549+ "functions/env.func (symlink)",
550+ "functions/error-stack.func (symlink)",
551+ "functions/fetch.func (symlink)",
552+ "functions/file.func (symlink)",
553+ "functions/icon.png.func (symlink)",
554+ "functions/imports.func (symlink)",
555+ "functions/json-string.func (symlink)",
556+ "functions/jsx.func (symlink)",
557+ "functions/modules.func (symlink)",
558+ "functions/node-compat.func (symlink)",
559+ "functions/prerender-custom.html.func (symlink)",
560+ "functions/prerender.func (symlink)",
561+ "functions/raw.func (symlink)",
562+ "functions/route-group.func (symlink)",
563+ "functions/rules/[...slug].func (symlink)",
564+ "functions/rules/_/cached/[...].isr.func (symlink)",
565+ "functions/rules/_/cached/[...].isr.prerender-config.json",
566+ "functions/rules/_/noncached/cached.isr.func (symlink)",
567+ "functions/rules/_/noncached/cached.isr.prerender-config.json",
568+ "functions/rules/isr/[...].isr.func (symlink)",
569+ "functions/rules/isr/[...].isr.prerender-config.json",
570+ "functions/rules/isr-ttl/[...].isr.func (symlink)",
571+ "functions/rules/isr-ttl/[...].isr.prerender-config.json",
572+ "functions/rules/swr/[...].isr.func (symlink)",
573+ "functions/rules/swr/[...].isr.prerender-config.json",
574+ "functions/rules/swr-ttl/[...].isr.func (symlink)",
575+ "functions/rules/swr-ttl/[...].isr.prerender-config.json",
576+ "functions/static-flags.func (symlink)",
577+ "functions/stream.func (symlink)",
578+ "functions/tasks/[...name].func (symlink)",
579+ "functions/wait-until.func (symlink)",
580+ "functions/wasm/dynamic-import.func (symlink)",
581+ "functions/wasm/static-import.func (symlink)",
582+ ]
583+ ` ) ;
584+ } ) ;
462585 }
463586 ) ;
464587} ) ;
0 commit comments