Skip to content

Commit c8c19c3

Browse files
committed
Remove default entry point
The optimal entry points are different between Blade apps and SPAs so this removes the default entry point in favour of specifying them explicitly for each use case.
1 parent d8860eb commit c8c19c3

File tree

2 files changed

+34
-38
lines changed

2 files changed

+34
-38
lines changed

src/index.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,36 @@ import { Plugin, loadEnv, UserConfig, ConfigEnv, Manifest, ResolvedConfig } from
77
interface PluginConfig {
88
/**
99
* The path or paths of the entry points to compile.
10-
*
11-
* @default ['resources/css/app.css', 'resources/js/app.js']
1210
*/
13-
input: string|string[]|undefined
11+
input: string|string[]
1412

1513
/**
1614
* Laravel's public directory.
1715
*
1816
* @default 'public'
1917
*/
20-
publicDirectory: string
18+
publicDirectory?: string
2119

2220
/**
2321
* The public subdirectory where compiled assets should be written.
2422
*
2523
* @default 'build'
2624
*/
27-
buildDirectory: string
25+
buildDirectory?: string
2826

2927
/**
3028
* The path of the SSR entry point.
3129
*
3230
* @default 'resources/js/ssr.js'
3331
*/
34-
ssr: string|string[]|undefined
32+
ssr?: string|string[]|undefined
3533

3634
/**
3735
* The directory where the SSR bundle should be written.
3836
*
3937
* @default 'storage/ssr'
4038
*/
41-
ssrOutputDirectory: string
39+
ssrOutputDirectory?: string
4240
}
4341

4442
interface LaravelPlugin extends Plugin {
@@ -50,7 +48,7 @@ interface LaravelPlugin extends Plugin {
5048
*
5149
* @param config - A config object or relative path(s) of the scripts to be compiled.
5250
*/
53-
export default function laravel(config?: string|string[]|Partial<PluginConfig>): LaravelPlugin {
51+
export default function laravel(config: string|string[]|PluginConfig): LaravelPlugin {
5452
const pluginConfig = resolvePluginConfig(config)
5553
let viteDevServerUrl: string
5654
let resolvedConfig: ResolvedConfig
@@ -197,11 +195,19 @@ function laravelVersion(): string {
197195
/**
198196
* Convert the users configuration into a standard structure with defaults.
199197
*/
200-
function resolvePluginConfig(config?: string|string[]|Partial<PluginConfig>): PluginConfig {
201-
if (typeof config === 'undefined' || typeof config === 'string' || Array.isArray(config)) {
198+
function resolvePluginConfig(config: string|string[]|PluginConfig): Required<PluginConfig> {
199+
if (typeof config === 'undefined') {
200+
throw new Error('Missing configuration')
201+
}
202+
203+
if (typeof config === 'string' || Array.isArray(config)) {
202204
config = { input: config, ssr: config }
203205
}
204206

207+
if (typeof config.input === 'undefined') {
208+
throw new Error('Missing configuration for key: input')
209+
}
210+
205211
if (typeof config.publicDirectory === 'string') {
206212
config.publicDirectory = config.publicDirectory.trim().replace(/^\/+/, '')
207213

@@ -223,7 +229,7 @@ function resolvePluginConfig(config?: string|string[]|Partial<PluginConfig>): Pl
223229
}
224230

225231
return {
226-
input: config.input ?? ['resources/css/app.css', 'resources/js/app.js'],
232+
input: config.input,
227233
publicDirectory: config.publicDirectory ?? 'public',
228234
buildDirectory: config.buildDirectory ?? 'build',
229235
ssr: config.ssr ?? 'resources/js/ssr.js',
@@ -234,14 +240,14 @@ function resolvePluginConfig(config?: string|string[]|Partial<PluginConfig>): Pl
234240
/**
235241
* Resolve the Vite base option from the configuration.
236242
*/
237-
function resolveBase(config: PluginConfig, assetUrl: string): string {
243+
function resolveBase(config: Required<PluginConfig>, assetUrl: string): string {
238244
return assetUrl + (! assetUrl.endsWith('/') ? '/' : '') + config.buildDirectory + '/'
239245
}
240246

241247
/**
242248
* Resolve the Vite input path from the configuration.
243249
*/
244-
function resolveInput(config: PluginConfig, ssr: boolean): string|string[]|undefined {
250+
function resolveInput(config: Required<PluginConfig>, ssr: boolean): string|string[]|undefined {
245251
if (ssr) {
246252
return config.ssr ?? config.input
247253
}
@@ -252,7 +258,7 @@ function resolveInput(config: PluginConfig, ssr: boolean): string|string[]|undef
252258
/**
253259
* Resolve the Vite outDir path from the configuration.
254260
*/
255-
function resolveOutDir(config: PluginConfig, ssr: boolean): string|undefined {
261+
function resolveOutDir(config: Required<PluginConfig>, ssr: boolean): string|undefined {
256262
if (ssr) {
257263
return config.ssrOutputDirectory
258264
}

tests/index.test.ts

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,16 @@ describe('laravel-vite-plugin', () => {
77
vi.clearAllMocks()
88
})
99

10-
it('provides sensible default values', () => {
11-
const plugin = laravel()
12-
expect(plugin.name).toBe('laravel')
13-
14-
const buildConfig = plugin.config({}, { command: 'build', mode: 'production' })
15-
expect(buildConfig.base).toBe('/build/')
16-
expect(buildConfig.build.manifest).toBe(true)
17-
expect(buildConfig.build.outDir).toBe('public/build')
18-
expect(buildConfig.build.rollupOptions.input).toEqual(['resources/css/app.css', 'resources/js/app.js'])
19-
20-
const serveConfig = plugin.config({}, { command: 'serve', mode: 'development' })
21-
expect(serveConfig.base).toBe('')
22-
expect(buildConfig.server.host).toBeUndefined()
23-
expect(buildConfig.server.port).toBeUndefined()
24-
expect(buildConfig.server.strictPort).toBeUndefined()
10+
it('handles missing configuration', () => {
11+
/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
12+
/* @ts-ignore */
13+
expect(() => laravel())
14+
.toThrowError('Missing configuration');
2515

26-
const ssrConfig = plugin.config({ build: { ssr: true } }, { command: 'build', mode: 'production' })
27-
expect(ssrConfig.base).toBe('/build/')
28-
expect(ssrConfig.build.manifest).toBe(false)
29-
expect(ssrConfig.build.outDir).toBe('storage/ssr')
30-
expect(ssrConfig.build.rollupOptions.input).toBe('resources/js/ssr.js')
16+
/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
17+
/* @ts-ignore */
18+
expect(() => laravel({}))
19+
.toThrowError('Missing configuration for key: input');
3120
})
3221

3322
it('accepts a single input', () => {
@@ -108,17 +97,18 @@ describe('laravel-vite-plugin', () => {
10897
})
10998

11099
it('prevents setting an empty publicDirectory', () => {
111-
expect(() => laravel({ publicDirectory: '' }))
100+
expect(() => laravel({ input: 'resources/js/app.js', publicDirectory: '' }))
112101
.toThrowError('publicDirectory must be a subdirectory');
113102
})
114103

115104
it('prevents setting an empty buildDirectory', () => {
116-
expect(() => laravel({ buildDirectory: '' }))
105+
expect(() => laravel({ input: 'resources/js/app.js', buildDirectory: '' }))
117106
.toThrowError('buildDirectory must be a subdirectory');
118107
})
119108

120109
it('handles surrounding slashes on directories', () => {
121110
const plugin = laravel({
111+
input: 'resources/js/app.js',
122112
publicDirectory: '/public/test/',
123113
buildDirectory: '/build/test/',
124114
ssrOutputDirectory: '/ssr-output/test/',
@@ -197,7 +187,7 @@ describe('laravel-vite-plugin', () => {
197187

198188
it('configures the Vite server when inside a Sail container', () => {
199189
process.env.LARAVEL_SAIL = '1'
200-
const plugin = laravel()
190+
const plugin = laravel('resources/js/app.js')
201191

202192
const config = plugin.config({}, { command: 'serve', mode: 'development' })
203193
expect(config.server.host).toBe('0.0.0.0')
@@ -210,7 +200,7 @@ describe('laravel-vite-plugin', () => {
210200
it('allows the Vite port to be configured when inside a Sail container', () => {
211201
process.env.LARAVEL_SAIL = '1'
212202
process.env.VITE_PORT = '1234'
213-
const plugin = laravel()
203+
const plugin = laravel('resources/js/app.js')
214204

215205
const config = plugin.config({}, { command: 'serve', mode: 'development' })
216206
expect(config.server.host).toBe('0.0.0.0')

0 commit comments

Comments
 (0)