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

servermock

v2.1.24

Published

not only static server and ajax mock data, support page mock like dynamic page, separation front-end and server. And you can install plugins free

Downloads

36

Readme

servermock

Install

$ sudo npm install servermock -g

or

# as a node_module like require('servermock')(config)
$ npm install servermock -save //--save-dev

Usage

start servermock

$ servermock start # or sm start
# params(you can config your sm.config):
# -p 8089(port)
# -i index.html (auto start the index.html page use your default browser)
# -n auto (auto fetch your wifi or wlan ip)
# @p synctest (synctest is the plugin name)

servermock init

$ servermock init  # or sm init
# init will generate a sm.config file in current path

servermock plugin

$ servermock plugin # or sm plugin
# params
# [intall | delete] | [-i | -d] [git repository]
servermock plugin intall https://github.com/shalles/synctest.git
# or
servermock plugin -i https://github.com/shalles/synctest.git

Config

start root path/sm.config

{
    "port": 8080, // start port default 80 unix need sudo
    "hostname": "0.0.0.0", // if set '0.0.0.0' auto fecth IPv4
    "protocol": "http", //https
    //"key": "~/cert/cert.key", // if protocol set to https
    //"cert": "~cert/cert.crt", // if protocol set to https
    "main": "./index.html", // auto start the index.html page use your default browser. default do nothing
    // plugins 
    "plugins":[{
        "name": "mock",
        "open": true,
        "param": {
            "datapath": "mock/", // default process.cwd()/mock/
            "mockrc": ".mockrc", // relative to mock datapath. certainly, you can use absolute path. default process.cwd()/mock/.mockrc
            "ignore": ["html", "jpg", "png", "gif"], // ignore file extname
            "acao": true, //Access-Control-Allow-Origin default:true
            "regexurl": { //patch mock url to local mock file.  support regular expression, use new RegExp(path)
                "com/api/mockdata.do": "mockdata.mjson",
                "/static/webapp/src/": "filemock.js",
                "/api/1placesuggestion" : "placesuggestion.js", //走js 遵循cmd
                "/api/1placesuggestion" : "placesuggestion.json", //
                "/api/placesuggestion" : "placesuggestion.mjson" //
            }
        }
    },{
        "name": "pagemock",
        "open": true,
        "param": {
            "basepath": "mock/page", //"", //default: same path with page
            "mockrc": "../.mockrc", // relative to mock basepath. certainly, you can use absolute path or share same .mockrc file with plugin mock such process.cwd()/mock/.mockrc
            "acceptExts": ["php", "html", "vm"] //listen page extname
        }
    },{
        // need install, such servermock plugin -i https://github.com/shalles/synctest.git
        // synchronous the operation with multiple instances in different devices
        "name": "synctest", 
        "open": true,
        "param": {
            //vpn: "192.168.1.6",
            "exts": ["html", "php", "vm"]
        }
    }]
}
  1. sm.config support simple comments "//";
  2. plugin on/off free;
  3. protocol:启动server服务的协议支持http/https, 当为https是需要传入key和cert两个证书文件;
  4. main提供的话会在start的时候启动浏览器打开服务,不提供则不打开;

更多配置使用请看对应插件

mock 配置请参考readme

pagemock 配置请参考readme

synctest 配置请参考readme

webpack(dev-server)中使用Demo

// 在dev-server启动后或之前加入
config.mock = {
    port: 8880, // 启动端口 默认80 unix系需要sudo
    hostname: 'localhost', // 当为0.0.0.0时自动获取当前IPv4
    protocol: 'http',
    plugins: [{
      name: 'mock',
      open: true,
      param: {
        datapath: 'mock/',
        mockrc: '.mockrc', // 相对mock datapath 可用绝对路径
        regexurl: {
          'api/getabc': 'getabc.js',
          'api/getabc2': 'getabc2.json',
          'api/getabc3': 'getabc3.mjson',
        }
      }
    }]
}
require('servermock')(config.mock)

// 配置代理
proxyTable: {
  "/api": {
    target: "http://localhost:8880", // 指向mock的server
    pathRewrite: {"^/api" : ""},
    changeOrigin: true,
    secure: false
  },
}

// 对应目录
// getabc.js -> 项目启动目录/mock/getabc.js
// getabc.json -> 项目启动目录/mock/getabc.json
// getabc.mjson -> 项目启动目录/mock/getabc.mjson

Plugin

插件安装/删除

//安装删除插件
servermock plugin [intall | delete] | [-i | -d] [git repository]
//如:
servermock plugin intall https://github.com/shalles/synctest.git
//或
servermock plugin -i https://github.com/shalles/synctest.git

Plugin List

  1. mock default
  2. pagemock default
  3. synctest need install
  4. ...

How To

  1. 主要实现两个方法initexcute;
  2. init的时候可以拿到用户配置sm.config中serverConfig的一些配置和servermock utils.js提供的一些使用方法具体可以看源码,虽然写的很差但会慢慢优化。 主要提倡用utils.log;
  3. 目前提供了两个插件口contentrouter 并在excute的时候提供不同的参数和返回值;
  4. package.json中配置需要servermock提供的支持;

如下以synctest为例

synctest的主要实现原理

  1. 监听页面的事件->编辑事件信息;
  2. 用servermock提供的websocket功能将编辑的事件信息广播到链接的其他设备的打开的页面监听client端;
  3. 在接收到事件信息后解析并重构事件;
  4. 触发该事件;
  5. 循环

a). 要在页面监听事件就需要向servermock启动的服务的页面文件中插入脚本,在servemock中属于content类插件即如下package.json中"type""content"; b). 需要用到servermock的websocket功能则需要配置websocket的信息这是正对servermock配置的,且高于默认配置,低于用户配置; c). 注意:servermock以文件的目录名位插件名,主目录下必须包含主文件index.jspackage.json, package.json与node同用,插件使用node module加载 因此写起来和node语法无异

package.json

    "servermock": {
        "type": "content",
        //"startbasepath": "./", 需要使用启动命令的插件  如 servermock start -p 8800 @p transport
        "websocket": {
            "open": true,
            "maxsize": 10240,
            "encoding": "utf8",
            "originReg": "",
            "sameOrigin": true,
            "broadcast": true,
            "mTm": false
        }
    },

index.js

var utils,
    origin,
    protocol,
    acceptExtname,
    plugin = {},
    path = require('path');

plugin.excute = function (params){
    
    if(utils.inArray(params.ext, acceptExtname)){
        utils.log('[synctest loading]');
        // do something
        return params.cnt;
    }
}

plugin.init = function(config){
    var serverConfig = config.__serverConfig; // sm.config中的部分配置信息
    
    utils = config.__utils; //utils.js
    acceptExtname = config.exts || ['html', 'htm'];
    origin = (config.vpn || serverConfig.hostname) + ":" + serverConfig.port;
    protocol = serverConfig.protocol

    /* 使用@p 插件启动参数的插件可能需要传入一些参数
    return {
        dirname: __dirname
    }
    */
}

module.exports = plugin;

content 与 router下 config

两个类型的插件在init提供相同的config参数,即__utils, __serverConfig;

content下的params

//当前请求
plugins.excute('router', {
    res: res,           //response mock插件拦截匹配的req,然后res返回mock数据
    req: req,           //request
    pathname: pathname, //请求的文件路径
    extname: extname    //请求的文件扩展
});

router下的params

// 当前请求
plugins.excute('content', {
    cnt: fileContent,   // 请求匹配文件内容
    stat: fdStat,       // 请求匹配文件的stat信息
    ext: extname,       // 请求匹配文件的扩展
    filepath: pathname  // 请求匹配文件的物理路径
})

目录结构

详情参考实例synctest

more see the test demo