Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion packages/vite/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ export default function inertia(options: InertiaPluginOptions = {}): Plugin {
const frameworks = { ...defaultFrameworks, ...toFrameworkRecord(options.frameworks) }

let entry: string | null = null
let hasAtAlias = false

return {
name: '@inertiajs/vite',
Expand All @@ -107,6 +108,8 @@ export default function inertia(options: InertiaPluginOptions = {}): Plugin {
},

configResolved(config) {
hasAtAlias = config.resolve.alias.some((a) => a.find === '@')

if (ssrDisabled) {
return
}
Expand Down Expand Up @@ -134,7 +137,7 @@ export default function inertia(options: InertiaPluginOptions = {}): Plugin {
) ?? result
}

return transformPageResolution(result, frameworks) ?? (result !== code ? result : null)
return transformPageResolution(result, frameworks, hasAtAlias) ?? (result !== code ? result : null)
},

configureServer(server) {
Expand Down
27 changes: 20 additions & 7 deletions packages/vite/src/pagesTransform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,11 @@ import { type NodeWithPos, ParsedCode, extractBoolean, extractString, extractStr
import type { FrameworkConfig } from './types'

/** Returns the transformed code, or null if no transformation was needed. */
export function transformPageResolution(code: string, frameworks: Record<string, FrameworkConfig>): string | null {
export function transformPageResolution(
code: string,
frameworks: Record<string, FrameworkConfig>,
hasAtAlias: boolean = false,
): string | null {
if (!code.includes('InertiaApp')) {
return null
}
Expand All @@ -61,11 +65,11 @@ export function transformPageResolution(code: string, frameworks: Record<string,
const extractDefault = framework.config.extractDefault ?? true

if (parsed.pagesProperty) {
return replacePages(code, parsed.pagesProperty, extensions, extractDefault)
return replacePages(code, parsed.pagesProperty, extensions, extractDefault, hasAtAlias)
}

if (parsed.callWithoutResolver) {
return injectResolver(code, parsed.callWithoutResolver, extensions, extractDefault)
return injectResolver(code, parsed.callWithoutResolver, extensions, extractDefault, hasAtAlias)
}

return null
Expand All @@ -82,6 +86,7 @@ function replacePages(
property: NodeWithPos<Property>,
defaultExtensions: string[],
extractDefault: boolean,
hasAtAlias: boolean = false,
): string {
const config = extractPagesConfig(property.value, code)

Expand All @@ -99,7 +104,7 @@ function replacePages(

const resolver = config.directory
? buildResolver(config.directory.replace(/\/$/, ''), extensions, extractDefault, eager, config.transform)
: buildDefaultResolver(extensions, extractDefault, eager)
: buildDefaultResolver(extensions, extractDefault, eager, hasAtAlias)

return code.slice(0, property.start) + resolver + code.slice(property.end)
}
Expand All @@ -117,8 +122,9 @@ function injectResolver(
call: { callEnd: number; options?: { start: number; end: number; isEmpty: boolean } },
extensions: string[],
extractDefault: boolean,
hasAtAlias: boolean = false,
): string {
const resolver = buildDefaultResolver(extensions, extractDefault)
const resolver = buildDefaultResolver(extensions, extractDefault, false, hasAtAlias)

if (!call.options) {
return code.slice(0, call.callEnd - 1) + `{ ${resolver} })` + code.slice(call.callEnd)
Expand Down Expand Up @@ -214,8 +220,15 @@ function buildResolver(
}`
}

function buildDefaultResolver(extensions: string[], extractDefault: boolean, eager: boolean = false): string {
return buildResolver(['./pages', './Pages'], extensions, extractDefault, eager)
function buildDefaultResolver(
extensions: string[],
extractDefault: boolean,
eager: boolean = false,
hasAtAlias: boolean = false,
): string {
const directories = ['./pages', './Pages', ...(hasAtAlias ? ['@/pages', '@/Pages'] : [])]

return buildResolver(directories, extensions, extractDefault, eager)
}

function buildGlob(directory: string, extensions: string[]): string {
Expand Down
41 changes: 40 additions & 1 deletion packages/vite/tests/pagesTransform.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import { describe, expect, it } from 'vitest'
import { defaultFrameworks } from '../src/frameworks/index'
import { transformPageResolution } from '../src/pagesTransform'

const transform = (code: string) => transformPageResolution(code, defaultFrameworks)
const transform = (code: string, hasAtAlias: boolean = false) =>
transformPageResolution(code, defaultFrameworks, hasAtAlias)

describe('Pages Transform', () => {
describe('returns null when no transform needed', () => {
Expand Down Expand Up @@ -309,4 +310,42 @@ export default createInertiaApp({
`)
})
})

describe('@ alias support', () => {
it('includes @/pages and @/Pages when hasAtAlias is true', () => {
const code = `import { createInertiaApp } from '@inertiajs/vue3'
export default createInertiaApp()`

const result = transform(code, true)
expect(result).toContain('@/pages/')
expect(result).toContain('@/Pages/')
})

it('does not include @/pages when hasAtAlias is false', () => {
const code = `import { createInertiaApp } from '@inertiajs/vue3'
export default createInertiaApp()`

const result = transform(code)
expect(result).not.toContain('@/pages/')
expect(result).not.toContain('@/Pages/')
})

it('includes @/pages for pages object without path', () => {
const code = `import { createInertiaApp } from '@inertiajs/vue3'
export default createInertiaApp({ pages: { lazy: true } })`

const result = transform(code, true)
expect(result).toContain('@/pages/')
expect(result).toContain('@/Pages/')
})

it('does not include @/pages when explicit path is set', () => {
const code = `import { createInertiaApp } from '@inertiajs/vue3'
export default createInertiaApp({ pages: './Custom' })`

const result = transform(code, true)
expect(result).not.toContain('@/pages/')
expect(result).toContain('./Custom/')
})
})
})
10 changes: 9 additions & 1 deletion packages/vite/tests/ssr.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -857,7 +857,15 @@ function createMockConfig(
ssr: boolean,
{ base = '/' }: { base?: string } = {},
): ResolvedConfig {
return { root: '/project', logger, plugins: [], build: { ssr }, command: 'build', base } as unknown as ResolvedConfig
return {
root: '/project',
logger,
plugins: [],
build: { ssr },
command: 'build',
base,
resolve: { alias: [] },
} as unknown as ResolvedConfig
}

function createMockServer(
Expand Down
Loading