import fs from 'fs'; import path from 'path'; import { trimWhitespaceSsr as trimWhitespace } from './plugins/trim-whitespace'; import { directiveSsr as t } from './plugins/i18n'; import { STANDARD } from './config/private-label'; require('dotenv').config(); const version = process.env.VERSION || process.env.DRONE_TAG || process.env.DRONE_VERSION || require('./package.json').version; const dev = (process.env.NODE_ENV !== 'production'); const api = process.env.API || 'http://localhost:8989'; const pl = process.env.PL || STANDARD; const commit = process.env.COMMIT || 'head'; const commitDate = process.env.COMMIT_DATE || ''; const commitBranch = process.env.COMMIT_BRANCH || ''; let routerBasePath = '/'; let resourceBase = ''; let outputDir = 'dist'; if ( typeof process.env.ROUTER_BASE !== 'undefined' ) { routerBasePath = process.env.ROUTER_BASE; } if ( typeof process.env.RESOURCE_BASE !== 'undefined' ) { resourceBase = process.env.RESOURCE_BASE; } if ( typeof process.env.OUTPUT_DIR !== 'undefined' ) { outputDir = process.env.OUTPUT_DIR; } if ( resourceBase && !resourceBase.endsWith('/') ) { resourceBase += '/'; } console.log(`Build: ${ dev ? 'Development' : 'Production' }`); // eslint-disable-line no-console if ( resourceBase ) { console.log(`Resource Base URL: ${ resourceBase }`); // eslint-disable-line no-console } if ( routerBasePath !== '/' ) { console.log(`Router Base Path: ${ routerBasePath }`); // eslint-disable-line no-console } if ( pl !== STANDARD ) { console.log(`PL: ${ pl }`); // eslint-disable-line no-console } console.log(`API: ${ api }`); // eslint-disable-line no-console module.exports = { dev, // Configuration visible to the client, https://nuxtjs.org/api/configuration-env env: { commit, commitDate, commitBranch, version, dev, pl, }, buildDir: dev ? '.nuxt' : '.nuxt-prod', buildModules: [ '@nuxtjs/style-resources', ], styleResources: { // only import functions, mixins, or variables, NEVER import full styles https://github.com/nuxt-community/style-resources-module#warning scss: [ '~assets/styles/base/_variables.scss', '~assets/styles/base/_functions.scss', '~assets/styles/base/_mixins.scss', ], }, // mode: 'spa', --- Use --spa CLI flag, or ?spa query param. loading: '~/components/Loading.vue', // Axios: https://axios.nuxtjs.org/options axios: { https: true, proxy: true, retry: { retries: 0 }, // debug: true }, router: { base: routerBasePath, middleware: ['i18n'], }, build: { publicPath: resourceBase, extend(config, { isClient, isDev }) { config.devtool = isClient ? 'source-map' : 'inline-source-map'; if ( resourceBase ) { config.output.publicPath = resourceBase; } config.module.rules.push({ test: /\.ya?ml$/i, loader: 'js-yaml-loader', options: { name: '[path][name].[ext]' }, }); // Run ESLint on save if (isDev && isClient) { config.module.rules.push({ enforce: 'pre', test: /\.(js|vue)$/, loader: 'eslint-loader', exclude: /(node_modules)/ }); } }, // extractCSS: true, cssSourceMap: true, babel: { presets({ isServer }) { return [ [ require.resolve('@nuxt/babel-preset-app'), { buildTarget: isServer ? 'server' : 'client', corejs: { version: 3 } } ] ]; }, plugins: ['@babel/plugin-transform-modules-commonjs'], } }, render: { bundleRenderer: { directives: { trimWhitespace, t, } } }, modern: true, generate: { dir: outputDir }, // Global CSS css: [ '@/assets/styles/app.scss' ], head: { title: process.env.npm_package_name || '', meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { hid: 'description', name: 'description', content: process.env.npm_package_description || '' } ], link: [{ rel: 'icon', type: 'image/x-icon', href: `${ resourceBase || '/' }favicon.png` }] }, // Nuxt modules modules: [ '@nuxtjs/proxy', '@nuxtjs/axios', '@nuxtjs/eslint-module', 'cookie-universal-nuxt', 'portal-vue/nuxt', '~/plugins/steve/rehydrate-all', ], // Vue plugins plugins: [ // Third-party '~/plugins/axios', '~/plugins/tooltip', '~/plugins/vue-clipboard2', '~/plugins/v-select', '~/plugins/transitions', { src: '~plugins/vue-js-modal' }, { src: '~/plugins/js-yaml', ssr: false }, { src: '~/plugins/resize', ssr: false }, { src: '~/plugins/shortkey', ssr: false }, // First-party '~/plugins/i18n', '~/plugins/global-formatters', '~/plugins/trim-whitespace', { src: '~/plugins/extend-router' }, { src: '~/plugins/lookup', ssr: false }, { src: '~/plugins/nuxt-client-init', ssr: false }, ], // Proxy: https://github.com/nuxt-community/proxy-module#options proxy: { '/k8s': proxyWsOpts(api), // Straight to a remote cluster (/k8s/clusters//) '/api': proxyWsOpts(api), // Managment k8s API '/apis': proxyWsOpts(api), // Managment k8s API '/v1': proxyWsOpts(api), // Management Steve API '/v3': proxyWsOpts(api), // Rancher API '/v3-public': proxyOpts(api), // Rancher Unauthed API '/api-ui': proxyOpts(api), // Browser API UI }, // Nuxt server server: { https: (dev ? { key: fs.readFileSync(path.resolve(__dirname, 'server/server.key')), cert: fs.readFileSync(path.resolve(__dirname, 'server/server.crt')) } : null), port: (dev ? 8005 : 80), host: '0.0.0.0', }, // Server middleware serverMiddleware: [ '~/server/no-ssr' ], // Eslint module options eslint: { cache: '.eslintcache' }, }; function proxyOpts(target) { return { target, secure: !dev, onProxyReq, onProxyReqWs, onError }; } function proxyWsOpts(target) { return { ...proxyOpts(target), ws: true, changeOrigin: true, }; } function onProxyReq(proxyReq, req) { proxyReq.setHeader('x-api-host', req.headers['host']); // console.log(proxyReq.getHeaders()); } function onProxyReqWs(proxyReq, req, socket, options, head) { req.headers.origin = options.target.href; proxyReq.setHeader('origin', options.target.href); proxyReq.setHeader('x-api-host', req.headers['host']); // console.log(proxyReq.getHeaders()); socket.on('error', (err) => { console.error('Proxy WS Error:', err); // eslint-disable-line no-console }); } function onError(err, req, res) { res.statusCode = 500; console.error('Proxy Error:', err); // eslint-disable-line no-console res.write(JSON.stringify(err)); }