npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

remok

v0.1.3

Published

A simple record and replay capable mock server.

Downloads

11

Readme

Remok

Remok is a simple record and replay capable mock server.

Remok graph

Features

  • Records requests
  • Replays recorded requests
  • Small footprint (only two tiny dependencies)
  • Works out of the box with zero config
  • Uses a powerful hash logic to store mocks
  • Written with future proof ECMAScript 2015 module syntax

Installation

Remok is available as the remok package on npm.

npm install --save-dev remok

How to use

API

const remok = require('remok');

const server = remok({
  server: {
    port: 3000,
  },
  mocks: {
    path: './mocks',
  },
  proxy: {
    target: 'https://some.api.tld',
  },
});

server.start();

CLI

$ remok --config ./remok.config.js
// remok.config.js
module.exports = {
  proxy: {
    target: 'https://some.api.tld',
  },
}

Test

You can test your setup by sending a request to the server:

curl http://localhost:3000/some/endpoint

Advanced usage

Manually creating a mock

Remok will always try to load a /path/to/mock/<METHOD>[email protected] file first, afterwards it searches for a /path/to/mock/<METHOD>.<REQUEST_HASH>.json file.

You can use the remok create-mock ./foo/GET CLI command in order to create a manual mock.

Activating the watch-mode mocks.watch: true will load new mocks without having to restart Remok.

Mock file structure

The following fields are required in a mock file:

{
  "time": "2018-01-01T00:00:00.000Z",
  "request": {
    "_hash": "requesthashvalue",
    "method": "GET",
    "path": "/foo/bar",
    "headers": {
      "key": "value"
    },
    "query": null,
    "body": null
  },
  "response": {
    "_hash": "responsehashvalue",
    "_time": null,
    "status": {
      "code": 201,
      "message": "custom status message"
    },
    "headers": {
      "key": "value"
    },
    "body": "I'm the response body!"
  }
}

History mode

🚧

API

remok([options])

Creates the Remok application.

| Property | Type | Default | Description | | ---------------- | ---------- | ------------------ | ---------------------------------------- | | verbose | boolean | true | Makes output more or less verbose | | | | | | | server.port | number | 3000 | Server port | | server.host | string | localhost | Server host | | | | | | | mocks.record | mixed | true | Whether to record mocks. Setting this option to overwrite will overwrite existing mocks. | | mocks.path | string | ./remok | Path used for storing recorded mocks | | mocks.history🚧 | boolean | false | Use the history mode | | mocks.watch | boolean | false | Reloads all mocks on every request. Useful for developing with manual mocks. | | mocks.reqHash | function | | Callback; receives a Request object, should return a request hash | | mocks.resHash | function | | Callback; receives a HttpResponse object, Should return a response hash | | | | | | | proxy.target | string | http://localhost | The proxy target | | proxy.timeout | number | 5000 | Proxy request timeout in milliseconds |

remok.start() async

Starts the Remok server.

remok.stop() async

Stops the Remok server.

remok.use([path,] callback) 🚧

Mounts the specified middleware for the specified path.

| Property | Type | Description | | ----------------- | --------- | --------------------------------- | | path | string | Route path. | | callback | mixed | Callback; can be: A middleware function. A class with a invoke() method. |

remok.useProxy([path,] callback) 🚧

Mounts the specified proxy middleware for the specified path.

| Property | Type | Description | | ----------------- | --------- | --------------------------------- | | path | string | Route path. | | callback | mixed | Callback; can be: A middleware function. A class with a invoke() method. |

FAQ

Why does Remok create a new mock on every request, even if the request is always the same?

In order to detect new requests, Remok calculates hashes based on the request and response data.

Please make sure to exclude request and response headers that change on every request.

In this example, body and headers are not used for calculating the hash:

// Calculates a SHA256 hash. You can use any other hash function.
const hash = require('remok/dist/hash');

remok({
  mocks: {
    requestHash: (Request) => hash(Request.method + Request.url),
  },
})

How can I handle different data on subsequent requests?

🚧

I have multiple test scenarios with endpoints responding with distinct data. How can I setup those scenarios?

You can setup scenarios by running Remok with a scenario-specific mock path:

// Scenario A
remok({
  mocks: {
    path: './mocks/scenario-a',
  }
});
// Scenario B
remok({
  mocks: {
    path: './mocks/scenario-b',
  }
});

Planned features

  • Middlewares
  • History mode
  • Record proxy response time

License

Remok is licensed under the MIT License - see the LICENSE file for details.