aspida-mock

TypeScript friendly RESTful API mock for aspida

Usage no npm install needed!

<script type="module">
  import aspidaMock from 'https://cdn.skypack.dev/aspida-mock';
</script>

README

aspida-mock





aspida


TypeScript friendly RESTful API mock for aspida.



Features

  • API mock dedicated to TypeScript using the type definition of aspida.
  • Supports all HTTP methods such as GET/POST/PUT/DELETE in a few lines.
  • No server required, works only with browser.

Usage

Installation

  • Using npm:

    $ npm install aspida-mock @aspida/axios axios
    # $ npm install aspida-mock @aspida/fetch
    # $ npm install aspida-mock @aspida/node-fetch node-fetch
    # $ npm install aspida-mock @aspida/ky ky
    
  • Using Yarn:

    $ yarn add aspida-mock @aspida/axios axios
    # $ yarn add aspida-mock @aspida/fetch
    # $ yarn add aspida-mock @aspida/node-fetch node-fetch
    # $ yarn add aspida-mock @aspida/ky ky
    

Creating API endpoints

Export mockMethods in aspida type definition file.

api/users/index.ts

import { mockMethods } from "aspida-mock"

export type Methods = {
  post: {
    query: { id: number }
    reqHeaders: { val: string }
    reqBody: { name: string }
    resHeaders: { token: string }
    resBody: {
      id: number
      name: string
    }
  }
}

export default mockMethods<Methods>({
  post: ({ query, reqHeaders, reqBody }) => ({
    status: 200,
    resHeaders: { token: reqHeaders.val },
    resBody: {
      id: query.id,
      name: reqBody.name
    }
  })
})

package.json

{
  "scripts": {
    "build": "aspida && aspida-mock"
  }
}

tarminal

$ npm run build

index.ts

import aspidaClient from "@aspida/axios" // "@aspida/fetch", "@aspida/node-fetch", "@aspida/ky"
import api from "./api/$api"
import mock from "./api/$mock"

const client = process.env.NODE_ENV === "development"
  ? mock(aspidaClient())
  : api(aspidaClient())

;(async () => {
  const res = await client.users.post({
    query: { id: 0 },
    headers: { val: "hoge" },
    data: { name: "fuga" }
  })

  console.log(res)
  /*
  {
    status: 200,
    headers: { token: "hoge" },
    data: { id: 0, name: "fuga" }
  }
  */
})()

Middleware

For every request, you can insert processing before reaching mockMethods.

api/@middleware.ts

import { mockMiddleware } from "aspida-mock"

export default mockMiddleware([
  (req, _res, next) => {
    next({ ...req, query: { hoge: req.query.hoge + 1 } })
  },
  (req, res) => {
    res({ status: 200, resBody: { fuga: req.query.hoge + 2 } })
  }
])

api/users/index.ts

import { mockMethods } from "aspida-mock"

export type Methods = {
  get: {
    query: { hoge: number }
    resBody: {
      fuga: number
    }
  }
}

export default mockMethods<Methods>({
  get: ({ query }) => ({
    status: 200,
    resBody: { fuga: query.hoge + 4 }
  })
})

index.ts

import aspidaClient from "@aspida/axios" // "@aspida/fetch", "@aspida/node-fetch", "@aspida/ky"
import mock from "./api/$mock"

const client = mock(aspidaClient())

;(async () => {
  const res = await client.users.get({
    query: { hoge: 0 }
  })

  console.log(res)
  /*
  {
    status: 200,
    data: { fuga: 3 }
  }
  */
})()

Options

aspida-mock has several options available.

delayMSec: number

Simulate response delay.

import aspidaClient from "@aspida/axios" // "@aspida/fetch", "@aspida/node-fetch", "@aspida/ky"
import mock from "./api/$mock"

const client = mock(aspidaClient(), { delayMSec: 500 })

;(async () => {
  console.time()
  await client.users.$get()
  console.timeEnd() // default: 506.590ms
})()

log: boolean

Switch request log output.

import aspidaClient from "@aspida/axios" // "@aspida/fetch", "@aspida/node-fetch", "@aspida/ky"
import mock from "./api/$mock"

const client = mock(aspidaClient(), { log: true })

;(async () => {
  await client.users.$get({ query: { bar: "baz" }})
  // [mock] get: /users?bar=baz => 200
})()

Cautions

.gitignore

Exclude $mock.ts generated by aspida-mock in the build from Git monitoring.

$ echo "\$mock.ts" >> .gitignore

# If Windows (Command Prompt)
> echo $mock.ts >> .gitignore

Command Line Interface Options

The following options can be specified in the Command Line Interface.

Option Type Default Description
--config
-c
string "aspida.config.js" Specify the path to the configuration file.
--watch
-w
Enable watch mode.
Regenerate $mock.ts according to the increase / decrease of the API endpoint file.
--version
-v
Print aspida-mock version.

Configuration

aspida-mock refers to only "input" among the items of the aspida configuration file aspida.config.js.
This allows you to always generate a mock from the same directory as aspida.
Options of aspida.config.js

License

aspida-mock is licensed under a MIT License.