You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

292 lines
13 KiB

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.refreshPaths = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const picocolors_1 = __importDefault(require("picocolors"));
const vite_1 = require("vite");
const vite_plugin_full_reload_1 = __importDefault(require("vite-plugin-full-reload"));
let exitHandlersBound = false;
exports.refreshPaths = [
'app/View/Components/**',
'resources/views/**',
'routes/**',
];
/**
* Laravel plugin for Vite.
*
* @param config - A config object or relative path(s) of the scripts to be compiled.
*/
function laravel(config) {
const pluginConfig = resolvePluginConfig(config);
return [
resolveLaravelPlugin(pluginConfig),
...resolveFullReloadConfig(pluginConfig),
];
}
exports.default = laravel;
/**
* Resolve the Laravel Plugin configuration.
*/
function resolveLaravelPlugin(pluginConfig) {
let viteDevServerUrl;
let resolvedConfig;
const defaultAliases = {
'@': '/resources/js',
};
return {
name: 'laravel',
enforce: 'post',
config: (userConfig, { command, mode }) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
const ssr = !!((_a = userConfig.build) === null || _a === void 0 ? void 0 : _a.ssr);
const env = (0, vite_1.loadEnv)(mode, userConfig.envDir || process.cwd(), '');
const assetUrl = (_b = env.ASSET_URL) !== null && _b !== void 0 ? _b : '';
return {
base: command === 'build' ? resolveBase(pluginConfig, assetUrl) : '',
publicDir: false,
build: {
manifest: !ssr,
outDir: (_d = (_c = userConfig.build) === null || _c === void 0 ? void 0 : _c.outDir) !== null && _d !== void 0 ? _d : resolveOutDir(pluginConfig, ssr),
rollupOptions: {
input: (_g = (_f = (_e = userConfig.build) === null || _e === void 0 ? void 0 : _e.rollupOptions) === null || _f === void 0 ? void 0 : _f.input) !== null && _g !== void 0 ? _g : resolveInput(pluginConfig, ssr)
},
},
server: {
origin: '__laravel_vite_placeholder__',
...(process.env.LARAVEL_SAIL ? {
host: (_j = (_h = userConfig.server) === null || _h === void 0 ? void 0 : _h.host) !== null && _j !== void 0 ? _j : '0.0.0.0',
port: (_l = (_k = userConfig.server) === null || _k === void 0 ? void 0 : _k.port) !== null && _l !== void 0 ? _l : (env.VITE_PORT ? parseInt(env.VITE_PORT) : 5173),
strictPort: (_o = (_m = userConfig.server) === null || _m === void 0 ? void 0 : _m.strictPort) !== null && _o !== void 0 ? _o : true,
} : undefined)
},
resolve: {
alias: Array.isArray((_p = userConfig.resolve) === null || _p === void 0 ? void 0 : _p.alias)
? [
...(_r = (_q = userConfig.resolve) === null || _q === void 0 ? void 0 : _q.alias) !== null && _r !== void 0 ? _r : [],
...Object.keys(defaultAliases).map(alias => ({
find: alias,
replacement: defaultAliases[alias]
}))
]
: {
...defaultAliases,
...(_s = userConfig.resolve) === null || _s === void 0 ? void 0 : _s.alias,
}
},
ssr: {
noExternal: noExternalInertiaHelpers(userConfig),
},
};
},
configResolved(config) {
resolvedConfig = config;
},
transform(code) {
if (resolvedConfig.command === 'serve') {
return code.replace(/__laravel_vite_placeholder__/g, viteDevServerUrl);
}
},
configureServer(server) {
var _a, _b;
const envDir = resolvedConfig.envDir || process.cwd();
const appUrl = (_a = (0, vite_1.loadEnv)(resolvedConfig.mode, envDir, 'APP_URL').APP_URL) !== null && _a !== void 0 ? _a : 'undefined';
(_b = server.httpServer) === null || _b === void 0 ? void 0 : _b.once('listening', () => {
var _a;
const address = (_a = server.httpServer) === null || _a === void 0 ? void 0 : _a.address();
const isAddressInfo = (x) => typeof x === 'object';
if (isAddressInfo(address)) {
viteDevServerUrl = resolveDevServerUrl(address, server.config);
fs_1.default.writeFileSync(pluginConfig.hotFile, viteDevServerUrl);
setTimeout(() => {
server.config.logger.info(`\n ${picocolors_1.default.red(`${picocolors_1.default.bold('LARAVEL')} ${laravelVersion()}`)} ${picocolors_1.default.dim('plugin')} ${picocolors_1.default.bold(`v${pluginVersion()}`)}`);
server.config.logger.info('');
server.config.logger.info(` ${picocolors_1.default.green('➜')} ${picocolors_1.default.bold('APP_URL')}: ${picocolors_1.default.cyan(appUrl.replace(/:(\d+)/, (_, port) => `:${picocolors_1.default.bold(port)}`))}`);
}, 100);
}
});
if (exitHandlersBound) {
return;
}
const clean = () => {
if (fs_1.default.existsSync(pluginConfig.hotFile)) {
fs_1.default.rmSync(pluginConfig.hotFile);
}
};
process.on('exit', clean);
process.on('SIGINT', process.exit);
process.on('SIGTERM', process.exit);
process.on('SIGHUP', process.exit);
exitHandlersBound = true;
return () => server.middlewares.use((req, res, next) => {
if (req.url === '/index.html') {
res.statusCode = 404;
res.end(fs_1.default.readFileSync(path_1.default.join(__dirname, 'dev-server-index.html')).toString().replace(/{{ APP_URL }}/g, appUrl));
}
next();
});
}
};
}
/**
* The version of Laravel being run.
*/
function laravelVersion() {
var _a, _b, _c;
try {
const composer = JSON.parse(fs_1.default.readFileSync('composer.lock').toString());
return (_c = (_b = (_a = composer.packages) === null || _a === void 0 ? void 0 : _a.find((composerPackage) => composerPackage.name === 'laravel/framework')) === null || _b === void 0 ? void 0 : _b.version) !== null && _c !== void 0 ? _c : '';
}
catch {
return '';
}
}
/**
* The version of the Laravel Vite plugin being run.
*/
function pluginVersion() {
var _a;
try {
return (_a = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '../package.json')).toString())) === null || _a === void 0 ? void 0 : _a.version;
}
catch {
return '';
}
}
/**
* Convert the users configuration into a standard structure with defaults.
*/
function resolvePluginConfig(config) {
var _a, _b, _c, _d, _e, _f, _g;
if (typeof config === 'undefined') {
throw new Error('laravel-vite-plugin: missing configuration.');
}
if (typeof config === 'string' || Array.isArray(config)) {
config = { input: config, ssr: config };
}
if (typeof config.input === 'undefined') {
throw new Error('laravel-vite-plugin: missing configuration for "input".');
}
if (typeof config.publicDirectory === 'string') {
config.publicDirectory = config.publicDirectory.trim().replace(/^\/+/, '');
if (config.publicDirectory === '') {
throw new Error('laravel-vite-plugin: publicDirectory must be a subdirectory. E.g. \'public\'.');
}
}
if (typeof config.buildDirectory === 'string') {
config.buildDirectory = config.buildDirectory.trim().replace(/^\/+/, '').replace(/\/+$/, '');
if (config.buildDirectory === '') {
throw new Error('laravel-vite-plugin: buildDirectory must be a subdirectory. E.g. \'build\'.');
}
}
if (typeof config.ssrOutputDirectory === 'string') {
config.ssrOutputDirectory = config.ssrOutputDirectory.trim().replace(/^\/+/, '').replace(/\/+$/, '');
}
if (config.refresh === true) {
config.refresh = [{ paths: exports.refreshPaths }];
}
return {
input: config.input,
publicDirectory: (_a = config.publicDirectory) !== null && _a !== void 0 ? _a : 'public',
buildDirectory: (_b = config.buildDirectory) !== null && _b !== void 0 ? _b : 'build',
ssr: (_c = config.ssr) !== null && _c !== void 0 ? _c : config.input,
ssrOutputDirectory: (_d = config.ssrOutputDirectory) !== null && _d !== void 0 ? _d : 'bootstrap/ssr',
refresh: (_e = config.refresh) !== null && _e !== void 0 ? _e : false,
hotFile: (_f = config.hotFile) !== null && _f !== void 0 ? _f : path_1.default.join(((_g = config.publicDirectory) !== null && _g !== void 0 ? _g : 'public'), 'hot')
};
}
/**
* Resolve the Vite base option from the configuration.
*/
function resolveBase(config, assetUrl) {
return assetUrl + (!assetUrl.endsWith('/') ? '/' : '') + config.buildDirectory + '/';
}
/**
* Resolve the Vite input path from the configuration.
*/
function resolveInput(config, ssr) {
if (ssr) {
return config.ssr;
}
return config.input;
}
/**
* Resolve the Vite outDir path from the configuration.
*/
function resolveOutDir(config, ssr) {
if (ssr) {
return config.ssrOutputDirectory;
}
return path_1.default.join(config.publicDirectory, config.buildDirectory);
}
function resolveFullReloadConfig({ refresh: config }) {
if (typeof config === 'boolean') {
return [];
}
if (typeof config === 'string') {
config = [{ paths: [config] }];
}
if (!Array.isArray(config)) {
config = [config];
}
if (config.some(c => typeof c === 'string')) {
config = [{ paths: config }];
}
return config.flatMap(c => {
const plugin = (0, vite_plugin_full_reload_1.default)(c.paths, c.config);
/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
/** @ts-ignore */
plugin.__laravel_plugin_config = c;
return plugin;
});
}
/**
* Resolve the dev server URL from the server address and configuration.
*/
function resolveDevServerUrl(address, config) {
var _a;
const configHmrProtocol = typeof config.server.hmr === 'object' ? config.server.hmr.protocol : null;
const clientProtocol = configHmrProtocol ? (configHmrProtocol === 'wss' ? 'https' : 'http') : null;
const serverProtocol = config.server.https ? 'https' : 'http';
const protocol = clientProtocol !== null && clientProtocol !== void 0 ? clientProtocol : serverProtocol;
const configHmrHost = typeof config.server.hmr === 'object' ? config.server.hmr.host : null;
const configHost = typeof config.server.host === 'string' ? config.server.host : null;
const serverAddress = isIpv6(address) ? `[${address.address}]` : address.address;
const host = (_a = configHmrHost !== null && configHmrHost !== void 0 ? configHmrHost : configHost) !== null && _a !== void 0 ? _a : serverAddress;
const configHmrClientPort = typeof config.server.hmr === 'object' ? config.server.hmr.clientPort : null;
const port = configHmrClientPort !== null && configHmrClientPort !== void 0 ? configHmrClientPort : address.port;
return `${protocol}://${host}:${port}`;
}
function isIpv6(address) {
return address.family === 'IPv6'
// In node >=18.0 <18.4 this was an integer value. This was changed in a minor version.
// See: https://github.com/laravel/vite-plugin/issues/103
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore-next-line
|| address.family === 6;
}
/**
* Add the Inertia helpers to the list of SSR dependencies that aren't externalized.
*
* @see https://vitejs.dev/guide/ssr.html#ssr-externals
*/
function noExternalInertiaHelpers(config) {
var _a;
/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
/* @ts-ignore */
const userNoExternal = (_a = config.ssr) === null || _a === void 0 ? void 0 : _a.noExternal;
const pluginNoExternal = ['laravel-vite-plugin'];
if (userNoExternal === true) {
return true;
}
if (typeof userNoExternal === 'undefined') {
return pluginNoExternal;
}
return [
...(Array.isArray(userNoExternal) ? userNoExternal : [userNoExternal]),
...pluginNoExternal,
];
}