UNPKG

laravel-mix-herd

Version:

Laravel Mix v6 extension that makes HMR work with Laravel Herd certificates

112 lines (89 loc) 2.32 kB
const path = require('path'); const fs = require('fs'); const mix = require('laravel-mix'); class LaravelMixHerd { constructor() { this.config = { host: this.getAppHost(), port: 8080, https: true, }; } name() { return 'herd'; } register(config = {}) { if (!this.isHot()) { return; } if (typeof config === 'string') { config = { host: config }; } this.config = { ...this.config, ...config, }; mix.options({ hmrOptions: { https: this.config.https, host: this.config.host, port: this.config.port, }, }); } boot() { if (!this.isHot()) { return; } } webpackConfig(config) { if (!this.isHot()) { return; } config.devServer.hot = true; config.output.publicPath = this.hotUrl(); if (this.config.https) { config.devServer.https = { key: this.loadCert('key'), cert: this.loadCert('crt'), }; } } loadCert(ext) { let dir; if (process.platform === 'linux') { dir = '.valet'; } if (['darwin', 'win32'].includes(process.platform)) { dir = './Library/Application Support/Herd/config/valet'; } if (!dir) { throw new Error(`Unsupported platform: ${process.platform}`); } const cert = path.resolve( process.env.HOME, `${dir}/Certificates/${this.config.host}.${ext}` ); if (!fs.existsSync(cert)) { throw new Error(`Could not find ${cert}`); } return fs.readFileSync(cert); } hotUrl() { return ( (this.config.https ? 'https' : 'http') + `://${this.config.host}:${this.config.port}/` ); } isHot() { return process.argv.includes('--hot'); } getAppHost() { try { return new URL(process.env.APP_URL).hostname; } catch (error) { return null; } } } mix.extend('herd', new LaravelMixHerd());