mirror of https://github.com/sundowndev/http.git
moved from nuxt-community/modules
commit
4c9ff4dddf
|
@ -0,0 +1,13 @@
|
||||||
|
# editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_size = 2
|
||||||
|
indent_style = space
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
|
@ -0,0 +1,28 @@
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parser: 'babel-eslint',
|
||||||
|
parserOptions: {
|
||||||
|
sourceType: 'module'
|
||||||
|
},
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
node: true
|
||||||
|
},
|
||||||
|
extends: 'standard',
|
||||||
|
// required to lint *.vue files
|
||||||
|
plugins: [
|
||||||
|
'html'
|
||||||
|
],
|
||||||
|
// add your custom rules here
|
||||||
|
rules: {
|
||||||
|
// allow paren-less arrow functions
|
||||||
|
'arrow-parens': 0,
|
||||||
|
// allow async-await
|
||||||
|
'generator-star-spacing': 0,
|
||||||
|
// allow debugger during development
|
||||||
|
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
|
||||||
|
// do not allow console.logs etc...
|
||||||
|
'no-console': 2
|
||||||
|
},
|
||||||
|
globals: {}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
node_modules
|
||||||
|
*.iml
|
||||||
|
.idea
|
||||||
|
*.log*
|
||||||
|
.nuxt
|
||||||
|
.vscode
|
||||||
|
.DS_STORE
|
||||||
|
coverage
|
|
@ -0,0 +1,189 @@
|
||||||
|
# Change Log
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
<a name="3.0.1"></a>
|
||||||
|
## [3.0.1](https://github.com/nuxt/modules/compare/@nuxtjs/axios@3.0.0...@nuxtjs/axios@3.0.1) (2017-07-25)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** typo in default headers ([9697559](https://github.com/nuxt/modules/commit/9697559))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="3.0.0"></a>
|
||||||
|
# [3.0.0](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.3.0...@nuxtjs/axios@3.0.0) (2017-07-25)
|
||||||
|
|
||||||
|
|
||||||
|
### Code Refactoring
|
||||||
|
|
||||||
|
* **axios:** remove $ shortcut mixins ([1ab2bd6](https://github.com/nuxt/modules/commit/1ab2bd6))
|
||||||
|
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* **axios:** You have to explicitly use `this.$axios.[method]` instead of `this.$[method]`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.3.0"></a>
|
||||||
|
# [2.3.0](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.2.4...@nuxtjs/axios@2.3.0) (2017-07-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **axios:** optionally disable error handling (#74) ([a195feb](https://github.com/nuxt/modules/commit/a195feb))
|
||||||
|
* **axios:** redirectError ([4ce1a1c](https://github.com/nuxt/modules/commit/4ce1a1c))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.2.4"></a>
|
||||||
|
## [2.2.4](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.2.3...@nuxtjs/axios@2.2.4) (2017-07-20)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** temporary fix for nuxt/nuxt.js#1127 ([499b639](https://github.com/nuxt/modules/commit/499b639)), closes [nuxt/nuxt.js#1127](https://github.com/nuxt/nuxt.js/issues/1127)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.2.3"></a>
|
||||||
|
## [2.2.3](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.2.1...@nuxtjs/axios@2.2.3) (2017-07-19)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** don't proxy Host header from request (#72, #39) ([61462ca](https://github.com/nuxt/modules/commit/61462ca))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.2.2"></a>
|
||||||
|
## [2.2.2](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.2.1...@nuxtjs/axios@2.2.2) (2017-07-19)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** don't proxy Host header from request (#72, #39) ([61462ca](https://github.com/nuxt/modules/commit/61462ca))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.2.1"></a>
|
||||||
|
## [2.2.1](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.2.0...@nuxtjs/axios@2.2.1) (2017-07-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** problems related to #65 ([4e7dd3f](https://github.com/nuxt/modules/commit/4e7dd3f))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.0.3"></a>
|
||||||
|
## [2.0.3](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.0.2...@nuxtjs/axios@2.0.3) (2017-06-10)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** Handle relative baseURL ([19b8453](https://github.com/nuxt/modules/commit/19b8453))
|
||||||
|
* handle 0.0.0.0 host ([610e0f5](https://github.com/nuxt/modules/commit/610e0f5))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.0.2"></a>
|
||||||
|
## [2.0.2](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.0.1...@nuxtjs/axios@2.0.2) (2017-06-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** Node 6.x support ([54deac0](https://github.com/nuxt/modules/commit/54deac0))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.0.1"></a>
|
||||||
|
## [2.0.1](https://github.com/nuxt/modules/compare/@nuxtjs/axios@2.0.0...@nuxtjs/axios@2.0.1) (2017-06-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** ensure store exists before injecting ([23ad7b7](https://github.com/nuxt/modules/commit/23ad7b7))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="2.0.0"></a>
|
||||||
|
# [2.0.0](https://github.com/nuxt/modules/compare/@nuxtjs/axios@1.0.2...@nuxtjs/axios@2.0.0) (2017-06-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** install using Vue.use ([184651b](https://github.com/nuxt/modules/commit/184651b))
|
||||||
|
* **axios:** req typo ([16f28b1](https://github.com/nuxt/modules/commit/16f28b1))
|
||||||
|
* **axios:** use relative `API_URL` if same host and port else `API_URL` ([3421d19](https://github.com/nuxt/modules/commit/3421d19))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **axios:** AXIOS_CREDENTIALS, AXIOS_SSR_HEADERS ([4dfdc2d](https://github.com/nuxt/modules/commit/4dfdc2d))
|
||||||
|
* **axios:** don't append optional config into env ([fe189e8](https://github.com/nuxt/modules/commit/fe189e8))
|
||||||
|
* **axios:** Easier API ([f54a434](https://github.com/nuxt/modules/commit/f54a434))
|
||||||
|
* **axios:** New API ([0194226](https://github.com/nuxt/modules/commit/0194226))
|
||||||
|
* **axios:** nuxt friendly errors for SSR ([65bc50f](https://github.com/nuxt/modules/commit/65bc50f))
|
||||||
|
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* **axios:** API_PREFIX is deprecated.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="1.0.2"></a>
|
||||||
|
## [1.0.2](https://github.com/nuxt/modules/compare/@nuxtjs/axios@1.0.0...@nuxtjs/axios@1.0.2) (2017-05-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** remove extra function call on computed prop ([cd9da0b](https://github.com/nuxt/modules/commit/cd9da0b))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="1.0.1"></a>
|
||||||
|
## [1.0.1](https://github.com/nuxt/modules/compare/@nuxtjs/axios@1.0.0...@nuxtjs/axios@1.0.1) (2017-05-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **axios:** remove extra function call on computed prop ([cd9da0b](https://github.com/nuxt/modules/commit/cd9da0b))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="1.0.0"></a>
|
||||||
|
# 1.0.0 (2017-05-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* initial migration to 1.0.0-alpha1 ([05c1b7a](https://github.com/nuxt/modules/commit/05c1b7a))
|
||||||
|
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* New modules system is backward incompatible with nuxt-helpers style modules
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="0.0.1"></a>
|
||||||
|
## 0.0.1 (2017-05-10)
|
|
@ -0,0 +1,259 @@
|
||||||
|
# Axios
|
||||||
|
[![npm](https://img.shields.io/npm/dt/@nuxtjs/axios.svg?style=flat-square)](https://npmjs.com/package/@nuxtjs/axios)
|
||||||
|
[![npm (scoped with tag)](https://img.shields.io/npm/v/@nuxtjs/axios/latest.svg?style=flat-square)](https://npmjs.com/package/@nuxtjs/axios)
|
||||||
|
|
||||||
|
Secure and Easy [axios](https://github.com/mzabriskie/axios) integration with Nuxt.js
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Automatically set base URL for client & server side
|
||||||
|
- Exposes `setToken` function to `$axios` so we can easily and globally set authentication tokens.
|
||||||
|
- Throws *nuxt-friendly* errors and optionally redirect on specific error codes.
|
||||||
|
- Automatically enables `withCredentials` when requesting to base URL.
|
||||||
|
- Proxy request headers in SSR.
|
||||||
|
- Fetch style requests
|
||||||
|
- [And more](https://github.com/mzabriskie/axios#features)
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
- Add `@nuxtjs/axios` dependency using yarn or npm to your project
|
||||||
|
- Add `@nuxtjs/axios` to `modules` section of `nuxt.config.js`
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
modules: [
|
||||||
|
// Simple usage
|
||||||
|
'@nuxtjs/axios',
|
||||||
|
|
||||||
|
// With options
|
||||||
|
['@nuxtjs/axios', { credentials: false }],
|
||||||
|
],
|
||||||
|
|
||||||
|
// You can optionally use global options instead of inline form
|
||||||
|
axios: {
|
||||||
|
credentials: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Component `asyncData`
|
||||||
|
|
||||||
|
```js
|
||||||
|
async asyncData({ app }) {
|
||||||
|
const {data} = await app.axios.get('http://icanhazip.com')
|
||||||
|
return {
|
||||||
|
ip: data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Store `nuxtServerInit`
|
||||||
|
```js
|
||||||
|
async nuxtServerInit ({ commit }, { app }) {
|
||||||
|
const ip = await app.axios.$get('http://icanhazip.com')
|
||||||
|
commit('SET_IP', ip)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Store actions
|
||||||
|
If you need axios instance in store actions, you may have to pass it when dispatching.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// In components
|
||||||
|
export default {
|
||||||
|
methods: {
|
||||||
|
updateIP() {
|
||||||
|
this.$store.dispatch('getIP', { axios: this.$axios })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// In store
|
||||||
|
{
|
||||||
|
actions: {
|
||||||
|
async getIP ({ commit }, { axios }) {
|
||||||
|
const ip = await axios.$get('http://icanhazip.com')
|
||||||
|
commit('SET_IP', ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Options
|
||||||
|
You can pass options using module options or `axios` section in `nuxt.config.js`
|
||||||
|
|
||||||
|
### `baseURL`
|
||||||
|
- Default: `http://[HOST]:[PORT]/api`
|
||||||
|
|
||||||
|
Base URL is required for requests in server-side & SSR and prepended to all requests with relative path.
|
||||||
|
You can also use environment variable `API_URL` which **overrides** `baseURL`.
|
||||||
|
|
||||||
|
### `browserBaseURL`
|
||||||
|
- Default: `/api`
|
||||||
|
|
||||||
|
Base URL which is used in client side prepended to all requests with relative path.
|
||||||
|
You can also use environment variable `API_URL_BROWSER` which **overrides** `browserBaseURL`.
|
||||||
|
|
||||||
|
- If `browserBaseURL` is not provided it defaults to `baseURL` value.
|
||||||
|
- If hostname & port of `browserbaseURL` are equal to nuxt server, it defaults to relative part of `baseURL`.
|
||||||
|
So if your nuxt application is being accessed under a different domain, requests go to same origin and prevents Cross-Origin problems.
|
||||||
|
|
||||||
|
### `credentials`
|
||||||
|
- Default: `true`
|
||||||
|
|
||||||
|
Adds an interceptor to automatically set `withCredentials` config of axios when requesting to `baseUrl`
|
||||||
|
which allows passing authentication headers to backend.
|
||||||
|
|
||||||
|
### `debug`
|
||||||
|
- Default: `false`
|
||||||
|
|
||||||
|
Adds interceptors to log all responses and requests
|
||||||
|
|
||||||
|
### `proxyHeaders`
|
||||||
|
- Default: `true`
|
||||||
|
|
||||||
|
In SSR context, sets client request header as axios default request headers.
|
||||||
|
This is useful for making requests which need cookie based auth on server side.
|
||||||
|
Also helps making consistent requests in both SSR and Client Side code.
|
||||||
|
|
||||||
|
### `redirectError`
|
||||||
|
- Default: `{}`
|
||||||
|
|
||||||
|
This option is a map from specific error codes to page which they should be redirect.
|
||||||
|
For example if you want redirecting all `401` errors to `/login` use:
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
axios: {
|
||||||
|
redirectError: {
|
||||||
|
401: '/login'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `requestInterceptor`
|
||||||
|
- Default: `null`
|
||||||
|
|
||||||
|
Function for manipulating axios requests. Useful for setting custom headers,
|
||||||
|
for example based on the store state. The second argument is the nuxt context.
|
||||||
|
|
||||||
|
```js
|
||||||
|
requestInterceptor: (config, { store }) => {
|
||||||
|
if (store.state.token) {
|
||||||
|
config.headers.common['Authorization'] = store.state.token
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Helpers
|
||||||
|
|
||||||
|
### Fetch Style requests
|
||||||
|
Axios plugin also supports fetch style requests with `$` prefixed methods:
|
||||||
|
```js
|
||||||
|
// Normal usage with axios
|
||||||
|
let data = (await axios.get('...')).data
|
||||||
|
|
||||||
|
// Fetch Style
|
||||||
|
let data = await axios.$get('...')
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setHeader(name, value, scopes='common')`
|
||||||
|
Axios instance has a helper to easily set any header.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- **name**: Name of the header
|
||||||
|
- **value**: Value of the header
|
||||||
|
- **scopes**: Send only on specific type of requests. Defaults
|
||||||
|
- Type: *Array* or *String*
|
||||||
|
- Defaults to `common` meaning all types of requests
|
||||||
|
- Can be `get`, `post`, `delete`, ...
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Adds header: `Authorization: 123` to all requests
|
||||||
|
this.$axios.setHeader('Authorization', '123')
|
||||||
|
|
||||||
|
// Overrides `Authorization` header with new value
|
||||||
|
this.$axios.setHeader('Authorization', '456')
|
||||||
|
|
||||||
|
// Adds header: `Content-Type: application/x-www-form-urlencoded` to only post requests
|
||||||
|
this.$axios.setHeader('Content-Type', 'application/x-www-form-urlencoded', ['post'])
|
||||||
|
|
||||||
|
// Removes default Content-Type header from `post` scope
|
||||||
|
this.$axios.setHeader('Content-Type', false, ['post'])
|
||||||
|
```
|
||||||
|
|
||||||
|
### `setToken(token, type, scopes='common')`
|
||||||
|
Axios instance has an additional helper to easily set global authentication header.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- **token**: Authorization token
|
||||||
|
- **type**: Authorization token prefix(Usually `Bearer`).
|
||||||
|
- **scopes**: Send only on specific type of requests. Defaults
|
||||||
|
- Type: *Array* or *String*
|
||||||
|
- Defaults to `common` meaning all types of requests
|
||||||
|
- Can be `get`, `post`, `delete`, ...
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Adds header: `Authorization: 123` to all requests
|
||||||
|
this.$axios.setToken('123')
|
||||||
|
|
||||||
|
// Overrides `Authorization` header with new value
|
||||||
|
this.$axios.setToken('456')
|
||||||
|
|
||||||
|
// Adds header: `Authorization: Bearer 123` to all requests
|
||||||
|
this.$axios.setToken('123', 'Bearer')
|
||||||
|
|
||||||
|
// Adds header: `Authorization: Bearer 123` to only post and delete requests
|
||||||
|
this.$axios.setToken('123', 'Bearer', ['post', 'delete'])
|
||||||
|
|
||||||
|
// Removes default Authorization header from `common` scope (all requests)
|
||||||
|
this.$axios.setToken(false)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dynamic API Backend
|
||||||
|
Please notice that, `API_URL` is saved into bundle on build, CANNOT be changed
|
||||||
|
on runtime! You may use [proxy](../proxy) module for dynamically route api requests to different backend on test/staging/production.
|
||||||
|
|
||||||
|
**Example: (`nuxt.config.js`)**
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
modules: [
|
||||||
|
'@nuxtjs/axios',
|
||||||
|
'@nuxtjs/proxy'
|
||||||
|
],
|
||||||
|
proxy: [
|
||||||
|
['/api', { target: 'http://www.mocky.io', pathRewrite: { '^/api': '/v2' } }]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Start Nuxt
|
||||||
|
```
|
||||||
|
[AXIOS] Base URL: http://localhost:3000/api | Browser: /api
|
||||||
|
[HPM] Proxy created: /api -> http://www.mocky.io
|
||||||
|
[HPM] Proxy rewrite rule created: "^/api" ~> "/v2"
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can make requests to backend: (Works fine in both SSR and Browser)
|
||||||
|
```js
|
||||||
|
async asyncData({app}) {
|
||||||
|
// Magically makes request to http://www.mocky.io/v2/59388bb4120000dc00a672e2
|
||||||
|
const nuxt = await app.axios.$get('59388bb4120000dc00a672e2')
|
||||||
|
|
||||||
|
return {
|
||||||
|
nuxt // -> { nuxt: 'Works!' }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Details
|
||||||
|
- `'@nuxtjs/axios'`
|
||||||
|
- By default axios plugin sets base url to `http://[host]:[port]/api` which is `http://localhost:3000/api`
|
||||||
|
|
||||||
|
- `'/api': 'http://www.mocky.io/v2'`
|
||||||
|
- This line creates a server middleware to pass requests from `/api` to `http://www.mocky.io/v2`
|
||||||
|
- We used `pathRewrite` to remove `/api` from starting of requests and change it to `/v2`
|
||||||
|
- For more information and advanced usage please refer to [proxy](../proxy) docs.
|
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"name": "@nuxtjs/axios",
|
||||||
|
"version": "3.1.0",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "src/index.js",
|
||||||
|
"repository": "https://github.com/nuxt-community/axios-module",
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "jest"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"testEnvironment": "node",
|
||||||
|
"coverageDirectory": "./coverage/",
|
||||||
|
"collectCoverage": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "^0.16.2",
|
||||||
|
"chalk": "^2.1.0",
|
||||||
|
"nuxt": "^1.0.0-rc4",
|
||||||
|
"whatwg-url": "^6.1.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "^4.4.1",
|
||||||
|
"eslint-config-standard": "^10.2.1",
|
||||||
|
"eslint-plugin-import": "^2.7.0",
|
||||||
|
"eslint-plugin-node": "^5.1.1",
|
||||||
|
"eslint-plugin-promise": "^3.5.0",
|
||||||
|
"eslint-plugin-standard": "^3.0.1",
|
||||||
|
"jest": "^20.0.4"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
const chalk = require('chalk')
|
||||||
|
const path = require('path')
|
||||||
|
const { hostname } = require('os')
|
||||||
|
const { URL } = require('whatwg-url')
|
||||||
|
|
||||||
|
const port = process.env.PORT || process.env.npm_package_config_nuxt_port || 3000
|
||||||
|
let host = process.env.HOST || process.env.npm_package_config_nuxt_host || 'localhost'
|
||||||
|
if (host === '0.0.0.0') {
|
||||||
|
host = hostname()
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function nuxtAxios (moduleOptions) {
|
||||||
|
// Apply defaults
|
||||||
|
const defaults = {
|
||||||
|
baseURL: `http://${host}:${port}/api`,
|
||||||
|
browserBaseURL: null,
|
||||||
|
credentials: true,
|
||||||
|
proxyHeaders: true,
|
||||||
|
debug: false,
|
||||||
|
redirectError: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = Object.assign({}, defaults, this.options.axios, moduleOptions)
|
||||||
|
|
||||||
|
// Override env
|
||||||
|
if (process.env.API_URL) {
|
||||||
|
options.baseURL = process.env.API_URL
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.env.API_URL_BROWSER) {
|
||||||
|
options.browserBaseURL = process.env.API_URL_BROWSER
|
||||||
|
}
|
||||||
|
|
||||||
|
const isSchemeLessBaseURL = options.baseURL.substr(0, 2) === '//'
|
||||||
|
options.baseURL = new URL(options.baseURL, `http://${host}:${port}`)
|
||||||
|
|
||||||
|
if (!options.browserBaseURL) {
|
||||||
|
const sameHost = options.baseURL.host === `${host}:${port}`
|
||||||
|
options.browserBaseURL = sameHost ? options.baseURL.pathname : isSchemeLessBaseURL ? options.baseURL.toString().substr(5) : options.baseURL // 5 == 'http:'.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register plugin
|
||||||
|
addPlugin.call(this, {
|
||||||
|
src: path.resolve(__dirname, 'plugin.js'),
|
||||||
|
fileName: 'axios.js',
|
||||||
|
options
|
||||||
|
})
|
||||||
|
|
||||||
|
/* eslint-disable no-console */
|
||||||
|
console.log(`[AXIOS] Base URL: ${chalk.green(options.baseURL)} , Browser: ${chalk.green(options.browserBaseURL)}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Temporary fix for nuxt/nuxt.js#1127
|
||||||
|
function addPlugin (template) {
|
||||||
|
const { dst } = this.addTemplate(template)
|
||||||
|
// Add to nuxt plugins
|
||||||
|
this.options.plugins.unshift({
|
||||||
|
src: path.join(this.options.buildDir, dst),
|
||||||
|
ssr: template.ssr
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.meta = require('../package.json')
|
|
@ -0,0 +1,180 @@
|
||||||
|
import Axios from 'axios'
|
||||||
|
import Vue from 'vue'
|
||||||
|
|
||||||
|
const axiosPlugin = {
|
||||||
|
install() {
|
||||||
|
if(Vue.__nuxt_axios_installed__) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Vue.__nuxt_axios_installed__ = true
|
||||||
|
|
||||||
|
if (!Vue.prototype.hasOwnProperty('$axios')) {
|
||||||
|
Object.defineProperty(Vue.prototype, '$axios', {
|
||||||
|
get () {
|
||||||
|
return this.$root.$options.$axios
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Vue.use(axiosPlugin)
|
||||||
|
|
||||||
|
// We cannot extend Axios.prototype
|
||||||
|
const axiosExtraProto = {}
|
||||||
|
|
||||||
|
// Sets a common header
|
||||||
|
axiosExtraProto.setHeader = function setHeader (name, value, scopes = 'common') {
|
||||||
|
if(!Array.isArray(scopes)) {
|
||||||
|
scopes = [scopes]
|
||||||
|
}
|
||||||
|
scopes.forEach(scope => {
|
||||||
|
if (!value) {
|
||||||
|
delete this.defaults.headers[scope][name];
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.defaults.headers[scope][name] = value
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set requests token
|
||||||
|
axiosExtraProto.setToken = function setToken (token, type, scopes = 'common') {
|
||||||
|
const value = !token ? null : (type ? type + ' ' : '') + token
|
||||||
|
this.setHeader('Authorization', value, scopes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Request helpers
|
||||||
|
const reqMethods = [
|
||||||
|
'request', 'delete', 'get', 'head', 'options', // url, config
|
||||||
|
'post', 'put', 'patch' // url, data, config
|
||||||
|
]
|
||||||
|
reqMethods.forEach(method => {
|
||||||
|
axiosExtraProto['$' + method] = function () {
|
||||||
|
return this[method].apply(this, arguments).then(res => res.data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Setup all helpers to axios instance (Axios.prototype cannot be modified)
|
||||||
|
function setupHelpers( axios ) {
|
||||||
|
for (let key in axiosExtraProto) {
|
||||||
|
axios[key] = axiosExtraProto[key].bind(axios)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const redirectError = <%= serialize(options.redirectError) %>
|
||||||
|
|
||||||
|
// Set appreciate `statusCode` and `message` to error instance
|
||||||
|
function errorHandler(error) {
|
||||||
|
if (error.response) {
|
||||||
|
// Error from backend (non 2xx status code)
|
||||||
|
// ...Auto redirect on special status codes
|
||||||
|
if (redirectError[error.response.status]) {
|
||||||
|
this.redirect(redirectError[error.response.status])
|
||||||
|
}
|
||||||
|
error.statusCode = error.statusCode || parseInt(error.response.status) || 500
|
||||||
|
error.message = error.message || error.response.statusText || (error.statusCode + ' (Internal Server Error)')
|
||||||
|
} else if (error.request) {
|
||||||
|
// Error while making request
|
||||||
|
error.statusCode = error.statusCode || 500
|
||||||
|
error.message = error.message || 'request error'
|
||||||
|
} else {
|
||||||
|
// Something happened in setting up the request that triggered an Error
|
||||||
|
error.statusCode = 500
|
||||||
|
error.message = error.message || 'axios error'
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.reject(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
<% if(options.debug) { %>
|
||||||
|
function debug(level, messages) {
|
||||||
|
if (!(console[level] instanceof Function)) {
|
||||||
|
level = 'info'
|
||||||
|
messages = arguments
|
||||||
|
} else {
|
||||||
|
level = arguments[0]
|
||||||
|
messages = Array.prototype.slice.call(arguments, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!messages.length) {
|
||||||
|
console[level].call(null, '[@nuxtjs/axios] <empty debug message>')
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < messages.length; i++) {
|
||||||
|
console[level].call(null, messages[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
// Setup BaseURL
|
||||||
|
const baseURL = process.browser
|
||||||
|
? (process.env.API_URL_BROWSER || '<%= options.browserBaseURL %>')
|
||||||
|
: (process.env.API_URL || '<%= options.baseURL %>')
|
||||||
|
|
||||||
|
export default (ctx) => {
|
||||||
|
const { app, store, req } = ctx
|
||||||
|
|
||||||
|
<% if(options.proxyHeaders) { %>
|
||||||
|
// Default headers
|
||||||
|
const defaultHeaders = (req && req.headers) ? Object.assign({}, req.headers) : {}
|
||||||
|
delete defaultHeaders.host
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
// Create new axios instance
|
||||||
|
const axios = Axios.create({
|
||||||
|
baseURL,
|
||||||
|
<% if(options.proxyHeaders) { %>headers: defaultHeaders,<% } %>
|
||||||
|
})
|
||||||
|
|
||||||
|
<% if(options.credentials) { %>
|
||||||
|
// Send credentials only to relative and API Backend requests
|
||||||
|
axios.interceptors.request.use(config => {
|
||||||
|
if (config.withCredentials === undefined) {
|
||||||
|
if (!/^https?:\/\//i.test(config.url) || config.url.indexOf(baseURL) === 0) {
|
||||||
|
config.withCredentials = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
});
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% if(options.debug) { %>
|
||||||
|
// Debug
|
||||||
|
axios.interceptors.request.use(config => {
|
||||||
|
debug('[@nuxtjs/axios] Request:', config)
|
||||||
|
return config
|
||||||
|
}, error => {
|
||||||
|
debug('error', '[@nuxtjs/axios] Error:', error)
|
||||||
|
return Promise.reject(error)
|
||||||
|
});
|
||||||
|
axios.interceptors.response.use(config => {
|
||||||
|
debug('[@nuxtjs/axios] Response:', config)
|
||||||
|
return config
|
||||||
|
}, error => {
|
||||||
|
debug('error', '[@nuxtjs/axios] Error:', error)
|
||||||
|
return Promise.reject(error)
|
||||||
|
});
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
<% if (options.requestInterceptor) { %>
|
||||||
|
// Custom request interceptor
|
||||||
|
const reqInter = <%= serialize(options.requestInterceptor).replace('requestInterceptor(', 'function(').replace('function function', 'function') %>
|
||||||
|
axios.interceptors.request.use(
|
||||||
|
(config) => reqInter(config, ctx)
|
||||||
|
)
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
// Error handler
|
||||||
|
axios.interceptors.response.use(undefined, errorHandler.bind(ctx));
|
||||||
|
|
||||||
|
// Make accessible using context
|
||||||
|
app.axios = app.$axios = axios
|
||||||
|
ctx.axios = ctx.$axios = axios
|
||||||
|
if (store) {
|
||||||
|
store.axios = store.$axios = axios
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup axios helpers
|
||||||
|
setupHelpers(axios)
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
const { Nuxt, Builder } = require('nuxt')
|
||||||
|
|
||||||
|
process.env.NODE_ENV = 'production'
|
||||||
|
|
||||||
|
describe('axios module', () => {
|
||||||
|
let nuxt
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000
|
||||||
|
nuxt = new Nuxt({ srcDir: __dirname + '/fixture', dev: false })
|
||||||
|
let builder = new Builder(nuxt)
|
||||||
|
builder.webpackStats = false
|
||||||
|
await builder.build()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test', () => {
|
||||||
|
expect(nuxt.options.dev).toBe(false)
|
||||||
|
})
|
||||||
|
})
|
|
@ -0,0 +1,11 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
Hello world!
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
Loading…
Reference in New Issue