@@ -2,6 +2,7 @@ import { TransformResult } from 'vite'
22import { expect , describe , it } from 'vitest'
33import { definePageTransform , extractDefinePageInfo } from './definePage'
44import { ts } from '../utils'
5+ import { mockWarn } from '../../tests/vitest-mock-warn'
56
67const vue = String . raw
78
@@ -21,6 +22,7 @@ const b = 1
2122 `
2223
2324describe ( 'definePage' , ( ) => {
25+ mockWarn ( )
2426 it ( 'removes definePage' , async ( ) => {
2527 const result = ( await definePageTransform ( {
2628 code : sampleCode ,
@@ -156,22 +158,25 @@ definePage({
156158 expect ( result ?. code ) . toMatchSnapshot ( )
157159 } )
158160
159- it ( 'throws if definePage uses a variable from the setup' , async ( ) => {
160- const code = vue `
161+ it ( 'handles definePage using a variable from setup gracefully ' , async ( ) => {
162+ const code = `
161163<script setup>
162164const a = 1
163165definePage({
164166 name: a,
165167})
166168</script>
167169`
168- // the function syntax works with sync and async errors
169- await expect ( async ( ) => {
170- await definePageTransform ( {
171- code,
172- id : 'src/pages/basic.vue&definePage&vue' ,
173- } )
174- } ) . rejects . toThrowError ( )
170+ const result = await definePageTransform ( {
171+ code,
172+ id : 'src/pages/basic.vue&definePage&vue' ,
173+ } )
174+
175+ // Should return empty object instead of throwing
176+ expect ( result ) . toBe ( 'export default {}' )
177+ expect (
178+ '`definePage()` in <script setup> cannot reference locally declared variables'
179+ ) . toHaveBeenWarned ( )
175180 } )
176181
177182 it ( 'extracts name and path' , ( ) => {
@@ -312,4 +317,52 @@ export default {
312317 path : '/custom' ,
313318 } )
314319 } )
320+
321+ describe ( 'error handling' , ( ) => {
322+ const codeWithSyntaxError = `
323+ <script setup>
324+ definePage({
325+ name: 'test',, // syntax error: extra comma
326+ path: '/test'
327+ })
328+ </script>
329+
330+ <template>
331+ <div>hello</div>
332+ </template>
333+ `
334+
335+ it ( 'handles syntax errors gracefully when extracting definePage' , async ( ) => {
336+ const result = await definePageTransform ( {
337+ code : codeWithSyntaxError ,
338+ id : 'src/pages/broken.vue?definePage&vue' ,
339+ } )
340+
341+ // Should return empty object instead of crashing
342+ expect ( result ) . toBe ( 'export default {}' )
343+ expect ( 'Failed to process definePage:' ) . toHaveBeenWarned ( )
344+ } )
345+
346+ it ( 'handles syntax errors gracefully when removing definePage from source' , async ( ) => {
347+ const result = await definePageTransform ( {
348+ code : codeWithSyntaxError ,
349+ id : 'src/pages/broken.vue' ,
350+ } )
351+
352+ // Should return undefined (no transform) instead of crashing
353+ expect ( result ) . toBeUndefined ( )
354+ expect ( 'Failed to process definePage:' ) . toHaveBeenWarned ( )
355+ } )
356+
357+ it ( 'handles extractDefinePageNameAndPath with syntax errors gracefully' , async ( ) => {
358+ const result = extractDefinePageInfo (
359+ codeWithSyntaxError ,
360+ 'src/pages/broken.vue'
361+ )
362+
363+ // Should return null/undefined instead of crashing
364+ expect ( result ) . toBeUndefined ( )
365+ expect ( 'Failed to extract definePage info:' ) . toHaveBeenWarned ( )
366+ } )
367+ } )
315368} )
0 commit comments