const path = require('path')
|
const consola = require('consola')
|
const defu = require('defu')
|
|
const logger = consola.withScope('nuxt:axios')
|
|
function axiosModule (_moduleOptions) {
|
const { nuxt } = this
|
|
// Combine options
|
const moduleOptions = {
|
...nuxt.options.axios,
|
..._moduleOptions,
|
...(nuxt.options.runtimeConfig && nuxt.options.runtimeConfig.axios)
|
}
|
|
// Default port
|
const defaultPort =
|
process.env.API_PORT ||
|
moduleOptions.port ||
|
process.env.PORT ||
|
process.env.npm_package_config_nuxt_port ||
|
(this.options.server && this.options.server.port) ||
|
3000
|
|
// Default host
|
let defaultHost =
|
process.env.API_HOST ||
|
moduleOptions.host ||
|
process.env.HOST ||
|
process.env.npm_package_config_nuxt_host ||
|
(this.options.server && this.options.server.host) ||
|
'localhost'
|
|
/* istanbul ignore if */
|
if (defaultHost === '0.0.0.0') {
|
defaultHost = 'localhost'
|
}
|
|
// Transpile defu (IE11)
|
if (nuxt.options.build.transpile /* nuxt 1 */) {
|
nuxt.options.build.transpile.push(({ isClient }) => isClient && 'defu')
|
}
|
|
// Default prefix
|
const prefix = process.env.API_PREFIX || moduleOptions.prefix || '/'
|
|
// HTTPS
|
const https = Boolean(this.options.server && this.options.server.https)
|
|
// Headers
|
const headers = {
|
common: {
|
Accept: 'application/json, text/plain, */*'
|
},
|
delete: {},
|
get: {},
|
head: {},
|
post: {},
|
put: {},
|
patch: {}
|
}
|
|
// Support baseUrl alternative
|
if (moduleOptions.baseUrl) {
|
moduleOptions.baseURL = moduleOptions.baseUrl
|
delete moduleOptions.baseUrl
|
}
|
if (moduleOptions.browserBaseUrl) {
|
moduleOptions.browserBaseURL = moduleOptions.browserBaseUrl
|
delete moduleOptions.browserBaseUrl
|
}
|
|
// Apply defaults
|
const options = defu(moduleOptions, {
|
baseURL: `http://${defaultHost}:${defaultPort}${prefix}`,
|
browserBaseURL: undefined,
|
credentials: false,
|
debug: false,
|
progress: true,
|
proxyHeaders: true,
|
proxyHeadersIgnore: [
|
'accept',
|
'cf-connecting-ip',
|
'cf-ray',
|
'content-length',
|
'content-md5',
|
'content-type',
|
'host',
|
'x-forwarded-host',
|
'x-forwarded-port',
|
'x-forwarded-proto'
|
],
|
proxy: false,
|
retry: false,
|
https,
|
headers
|
})
|
|
// ENV overrides
|
|
/* istanbul ignore if */
|
if (process.env.API_URL) {
|
options.baseURL = process.env.API_URL
|
}
|
|
/* istanbul ignore if */
|
if (process.env.API_URL_BROWSER) {
|
options.browserBaseURL = process.env.API_URL_BROWSER
|
}
|
|
// Default browserBaseURL
|
if (typeof options.browserBaseURL === 'undefined') {
|
options.browserBaseURL = options.proxy ? prefix : options.baseURL
|
}
|
|
// Normalize options
|
if (options.retry === true) {
|
options.retry = {}
|
}
|
|
// Convert http:// to https:// if https option is on
|
if (options.https === true) {
|
const https = s => s.replace('http://', 'https://')
|
options.baseURL = https(options.baseURL)
|
options.browserBaseURL = https(options.browserBaseURL)
|
}
|
|
// globalName
|
options.globalName = this.nuxt.options.globalName || 'nuxt'
|
|
// Register plugin
|
this.addPlugin({
|
src: path.resolve(__dirname, 'plugin.js'),
|
fileName: 'axios.js',
|
options
|
})
|
|
// Proxy integration
|
if (options.proxy) {
|
this.requireModule([
|
'@nuxtjs/proxy',
|
typeof options.proxy === 'object' ? options.proxy : {}
|
])
|
}
|
|
// Set _AXIOS_BASE_URL_ for dynamic SSR baseURL
|
process.env._AXIOS_BASE_URL_ = options.baseURL
|
|
logger.debug(`baseURL: ${options.baseURL}`)
|
logger.debug(`browserBaseURL: ${options.browserBaseURL}`)
|
}
|
|
module.exports = axiosModule
|
module.exports.meta = require('../package.json')
|