{"_id":"@8pattern/jmock","_rev":"6-d76c1cbca30bc2bb55f04c93891df62b","time":{"0.1.0":"2019-11-01T03:35:11.234Z","created":"2019-11-04T09:37:00.405Z","0.1.1":"2019-11-04T09:37:00.799Z","modified":"2022-04-04T10:50:08.373Z","0.1.2":"2019-11-05T06:08:39.370Z","0.2.0":"2019-12-20T09:44:47.133Z"},"name":"@8pattern/jmock","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"@8pattern/jmock","version":"0.1.1","description":"a mock lib for JS","scripts":{"dev":"ts-node-dev ./src","build":"webpack --mode=production","test":"jest"},"keywords":["mock"],"author":{"name":"8th-pattern"},"license":"MIT","main":"./dist/jmock.js","devDependencies":{"@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-typescript":"^7.6.0","@types/express":"^4.17.1","@types/express-ws":"^3.0.0","@types/jest":"^24.0.18","@types/mockjs":"^1.0.2","babel-loader":"^8.0.6","clean-webpack-plugin":"^3.0.0","jest":"^24.9.0","jest-cli":"^24.9.0","terser-webpack-plugin":"^2.1.0","ts-jest":"^24.1.0","ts-node-dev":"^1.0.0-pre.44","typescript":"^3.6.3","webpack":"^4.41.2","webpack-cli":"^3.3.9"},"dependencies":{"express":"^4.17.1","express-ws":"^4.0.0","mockjs":"^1.0.1-beta3"},"bin":{"jmock":"jmock-cli.js"},"repository":{"type":"git","url":"git+https://github.com/8th-pattern/jMock.git"},"bugs":{"url":"https://github.com/8th-pattern/jMock/issues"},"homepage":"https://github.com/8th-pattern/jMock#readme","gitHead":"d1ae07a7ef1451972ad9b530d7dcfa5fc80d9684","_id":"@8pattern/jmock@0.1.1","_nodeVersion":"12.13.0","_npmVersion":"6.12.1","dist":{"integrity":"sha512-FaJ7Dj5RhUAZLyAqrmvAnAGZJk2VvzsloB6oiser32lh/8IkIYmat8gLMp5TC3xsTMswdOlj5hDUPUJ/dk2yTA==","shasum":"8df2c8491d9edfae2305fcacbd1b258dd4ba33a5","tarball":"https://registry.npmjs.org/@8pattern/jmock/-/jmock-0.1.1.tgz","fileCount":20,"unpackedSize":774259,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdv/E9CRA9TVsSAnZWagAAVwEP/0Ff2k3w+F60BMAVLzSa\ndrC+diuv+5v3zd7sJF3Zor55/WkoLcO24rk73BkyLDmliuFVGEidrwRVeCYB\nWAHSgIbuZJR2DDAkftR70iGaB0PGKgnipJYfsARnWDBcAeBQAso80Dme1a0q\nkceX8iFUVP1u2lCMJXCMr9nKOjqSHAZx1MixcTvczpyIoqAw6EDKYoXYaDv8\nLQIWhXJ3SKMb8BvDjLzLN+NqMk6hQkSW1jLICa5KAPmTMiFr8N/ATwMy+C/P\nEfebUkoUlZU5ZDu2CmhZo3EaJxDA3zC9oBYWCf3yFyrEgAzY1QJLaW1iQmSh\nH3lc2rTj0tdTWsQQBCQKFB8tXUAqKyEevUAYZiIpw3MPoeImGYOb+5+fyESY\nu6bgxZdQ7DRDQpt0iY87VkkuXHufAHtu4443jIdy+zeCzoWL5u8tLtkZQKSh\nacoBmp6NV1nwnlo7Cq6WfXjeqdKjeKCPSv4WvyX1m/YYznauxi4Dg2+/epAU\nvnTkBR19IPtNVgfX2B80XFmXUeX3L3r282zFc7aruE9kRAhilKNg8rGo1ujF\nWZtV4b0ewGV7bYoldh2xzeajJlOgQZl4pMDFfb5pYmZX4WWrd7JkcdK+Lvlf\nr+vA7dMF3HIYHHSyF+i08sshjC0FwliMr2xFZEjzFHSFqxgxjLcYL1NktwnH\n+9d3\r\n=0nWv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNRLOpXwqSCuhxowNgKEx1/3RcuDnIpOC7m+ZHDLa7IQIgSvlMK7MUzz22arpdWteH6tiAcG3LK3GhBHDBNwXw4Jk="}]},"maintainers":[{"name":"8pattern","email":"eighth.principle@gmail.com"}],"_npmUser":{"name":"8pattern","email":"eighth.principle@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/jmock_0.1.1_1572860220630_0.46829156330669486"},"_hasShrinkwrap":false},"0.1.2":{"name":"@8pattern/jmock","version":"0.1.2","description":"a mock server for JS","scripts":{"dev":"ts-node-dev ./src","build":"webpack --mode=production","test":"jest"},"keywords":["mock","http","websocket"],"author":{"name":"8th-pattern"},"license":"MIT","main":"./dist/jmock.js","devDependencies":{"@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-typescript":"^7.6.0","@types/express":"^4.17.1","@types/express-ws":"^3.0.0","@types/jest":"^24.0.18","@types/mockjs":"^1.0.2","babel-loader":"^8.0.6","clean-webpack-plugin":"^3.0.0","jest":"^24.9.0","jest-cli":"^24.9.0","terser-webpack-plugin":"^2.1.0","ts-jest":"^24.1.0","ts-node-dev":"^1.0.0-pre.44","typescript":"^3.6.3","webpack":"^4.41.2","webpack-cli":"^3.3.9"},"dependencies":{"express":"^4.17.1","express-ws":"^4.0.0","mockjs":"^1.0.1-beta3"},"bin":{"jmock":"jmock-cli.js"},"repository":{"type":"git","url":"git+https://github.com/8th-pattern/jMock.git"},"bugs":{"url":"https://github.com/8th-pattern/jMock/issues"},"homepage":"https://github.com/8th-pattern/jMock#readme","gitHead":"a160dbc26b9dfa85f3fb9d386532b14d5d477251","_id":"@8pattern/jmock@0.1.2","_nodeVersion":"12.13.0","_npmVersion":"6.12.1","dist":{"integrity":"sha512-4H/VWoUA338T7gEpp0x7ZiKRIfOQAw/MxT6ohzlYpT6rqAra+zBUWC24+0RQgKSGwA7MppGHASyMI4Zc7SCp7A==","shasum":"025bf1c0e8665fc43bf56817afcd88fe047b706c","tarball":"https://registry.npmjs.org/@8pattern/jmock/-/jmock-0.1.2.tgz","fileCount":20,"unpackedSize":777674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdwRHnCRA9TVsSAnZWagAAte0P/3OvoRT+FFDErOskyh2C\nZcOdfYw+wwTxvTbUyajR47FgFSEcH8KLM3zPu0GVUTtpxt6itNE+6oltdReA\nzjHh1e9BEmo3RNS5VY0i0YMn3d3LppEnKVf3uIb/mRlvdw5ZIvIpwH4LaTYN\nFaTdL85MbTDE12RyTh2ceoNaTaXxhJsqHwhFhSzHpCXxKxj9Iia9pM8ivq1x\nfzlPTcoeIiIlreNeMSLkQR3SyWBrZZFTnjddACIB1TvHE5VS5mshVbHsG3Ev\nAWDJJ0kp6AMBF+1nGm5Qu+ZQ7ZVCTOTX7duBohRJAA/7GooccOFctAPHT4bs\nnFy7BLrcxOUHz2/JxYs7T7+FMwG5vJrKqMaXHUJyCMJtHz+TQOyzaQ3PZNF1\nvSgAtnYoTSTKhufLCJzngtHOc3wz6rsWzdPpOIy659VCPHFlJ3UYOCuPmiCf\nktfX2vctitHl/q7GL6m6Hjrk5q+BaPmeZgKUX/g3rUlaPZot5vfN3rt5Gifb\nn/R876eHrOTZeKjmZoUtMMwnFLlQjOMjwUd8oG3xhbXnHl013xqY3fIDCbqm\n9WDyR2E8BXXy2vybVhO1RW8mqIssJPR8Vjnz+OXM07UDft0Ou+vCRgndMdkt\nPCV67QyPoFtpW9sDiXqfJiuVgpP+7nk87v8fg2mFvqMJQClLEpObJb+VHMS6\n+ICZ\r\n=UvIi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEYXRl9l8RcFr3I6yhDEF8QCyhT/rdXi+5CEdGIGpk8NAiEA/VBiqZazOMG4lYwAdmEVuVuEcrIPJSZTBB6z8xjP/Qg="}]},"maintainers":[{"name":"8pattern","email":"eighth.principle@gmail.com"}],"_npmUser":{"name":"8pattern","email":"eighth.principle@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/jmock_0.1.2_1572934119127_0.3748064419629398"},"_hasShrinkwrap":false},"0.2.0":{"name":"@8pattern/jmock","version":"0.2.0","description":"a mock server for JS","scripts":{"dev":"ts-node-dev ./src","prebuild":"tsc && npm run test","build":"webpack --mode=production","test":"jest","test:watch":"jest --watch","publish":"npm run build && npm publish --access=public --registry http://registry.npmjs.org"},"keywords":["mock","http","websocket"],"author":{"name":"8th-pattern"},"license":"MIT","main":"./dist/jmock.js","devDependencies":{"@babel/plugin-proposal-class-properties":"^7.5.5","@babel/plugin-proposal-object-rest-spread":"^7.5.5","@babel/preset-typescript":"^7.6.0","@types/express":"^4.17.1","@types/express-ws":"^3.0.0","@types/jest":"^24.0.18","@types/mockjs":"^1.0.2","babel-loader":"^8.0.6","clean-webpack-plugin":"^3.0.0","jest":"^24.9.0","jest-cli":"^24.9.0","terser-webpack-plugin":"^2.1.0","ts-jest":"^24.1.0","ts-node-dev":"^1.0.0-pre.44","typescript":"^3.6.3","webpack":"^4.41.2","webpack-cli":"^3.3.9"},"dependencies":{"@8pattern/jcommand":"^0.1.0","express":"^4.17.1","express-ws":"^4.0.0","mockjs":"^1.0.1-beta3"},"bin":{"jmock":"jmock-cli.js"},"repository":{"type":"git","url":"git+https://github.com/8th-pattern/jMock.git"},"bugs":{"url":"https://github.com/8th-pattern/jMock/issues"},"homepage":"https://github.com/8th-pattern/jMock#readme","gitHead":"86680c1e86efa54d7ef574a4274412a1b4175ce5","_id":"@8pattern/jmock@0.2.0","_nodeVersion":"12.13.0","_npmVersion":"6.12.1","dist":{"integrity":"sha512-rfwh879O0PGFTC1jx0wYvtWnwO3LZeSXcq6bu3Y8thLEfPTA94p47mk6iZ2d+EuYA+3cKi7DZiYtH5yzgHOTjQ==","shasum":"4e464db52e18a3e6afb58ea4ea7fd01b219dbc2d","tarball":"https://registry.npmjs.org/@8pattern/jmock/-/jmock-0.2.0.tgz","fileCount":23,"unpackedSize":789834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd/JgPCRA9TVsSAnZWagAAdcIP/2e2TvV1knB9TXyS6yzB\n0VnvfIUnjulp64o/JDn2D2t5jnMw0ui58GVPIogZ5B7/qIaJhBq0owqkwyrU\nXZ/vtH4PwPoGF/9f0LvR/qTsq2a+35hxPTKBmhKXHL4l/m0+NJKWePzEpK+N\nQBaD0XBRKy/480K8nFJflYea9tveRHAyP4ZZrXD4xb3tvQMPgYC5OwtSutCg\nu3hDTaV2socC2UC/0DwMRYwAxmOsCKYB/3pbN2vRCpCLBrmISpxDmQDHL9kJ\nGLn2yXNa05uBWaHnA8hBD7m9VC8b2l73wSV0RSYqaKRcuOoWqAzs55FgehQu\nFn9xZazr59hLUM2dXBf7xXMYqRf+VnS1qQSUozvtkmLIoyFA/G20OxaL6/jw\n/u1S4+55MizVy9+AHnlhLzKMK29Y7qj+pvtbXPI7LXhTZB1ZWq1tPZMBZfwc\nvo5msXchM9TMpZL0f89SCDYjiHfpzVAmwtSjCyT4ZYe+siIQEBBQeX5v6MT0\nPkMfHis6JoSJiUyYkviv1R2CsJRrcqOhzTDUmDwnioG5uaFvm2rX7JLR2D3k\nql0ZNDEmO9myNwTnmBgnD9uquyqzYmFpU9l1gb6iPdhKybGnegkybF3WpP4l\nsRdA2LOqEWhO4Kt6It40FQWiBnkLE5G7wWgM3PuZ1v94fhdIS53cXqWOyOQb\nB1e8\r\n=fRah\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYlFK/n7LRIFyw2IG6uv2kSPqnsKsJ7Z06K6EkE8QsdAIhANEMYXkTRv5O0buIbr5MVKvg6MeQdFHO2HQbnYl+nypd"}]},"maintainers":[{"name":"8pattern","email":"eighth.principle@gmail.com"}],"_npmUser":{"name":"8pattern","email":"eighth.principle@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/jmock_0.2.0_1576835086932_0.07828634405810964"},"_hasShrinkwrap":false}},"maintainers":[{"name":"8pattern","email":"eighth.principle@gmail.com"}],"description":"a mock server for JS","homepage":"https://github.com/8th-pattern/jMock#readme","keywords":["mock","http","websocket"],"repository":{"type":"git","url":"git+https://github.com/8th-pattern/jMock.git"},"author":{"name":"8th-pattern"},"bugs":{"url":"https://github.com/8th-pattern/jMock/issues"},"license":"MIT","readme":"# jMock \r\nA **mock server** for JS, support **HTTP** methods and **Websocket**\r\n\r\n\r\n\r\n## Install\r\n\r\n```javascript\r\nnpm install @8pattern/jmock\r\n```\r\n\r\n\r\n\r\n## Usage\r\n\r\n### MockData Difination\r\n\r\nThe MockData is defined as following:\r\n\r\n```javascript\r\n{\r\n\t[Path]: {\r\n\t\t[Method1]: [MockItem1],\r\n\t\t[Method2]: [MockItem2],\r\n\t},\r\n\t[Path2]: { ... }\r\n}\r\n```\r\n\r\nFor example:\r\n\r\n```javascript\r\n{\r\n\t'/mock/item/:productName': {\r\n\t\tGET: '@name',\r\n\t\tPOST: function(cb, req, param) {\r\n\t\t\tif (req.id) {\r\n\t\t\t\tcb({ id: req.id, name: param.productName })\r\n\t\t\t} else {\r\n\t\t\t\tcb({ desc: 'error' })\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t'/mock/item2/.*': {\r\n\t\tPUT: {\r\n\t\t\t'name|+1': number\r\n\t\t}\r\n\t},\r\n\t'/ws/mock': {\r\n\t\tWS: (cb, req) => {\r\n\t\t    if (req.id) {\r\n\t\t\tcb('@name')\r\n\t\t    }\r\n\t\t}\r\n\t}\r\n}\r\n```\r\n\r\n+ **Path** &lt;string&gt;\r\n  \r\n\t1. It can receive an exact, fuzzy or regular expression pattern to match the request url.\r\n\t\t+ **Exact**: the url must match the whole pattern, e.g., \"/a/b\"\r\n\t\t+ **Fuzzy**: support \":&lt;name&gt;\" or \"*\" to match the url.\r\n\t\t> + :&lt;name&gt;： match only a sub route, i.e. \"/:url\" can match \"/a\", but can **NOT** match \"/a/b\"\r\n\t\t> + *:  match any routes, i.e., \"/route/\\*\" can match \"/route/1\" and \"/route/1/2\", but can **NOT** match \"/1/2\"\r\n\t\t+ **Reg**: use regular expressions as the pattern, i.e., \"/(.*?)/(?&lt;id>.&gt;?)\" \r\n\t\t> + Be aware **NOT** define it as RegExp directly, i.e., use *'a/b/.\\*'* rather than */a/b/.\\*/*. (Because object can't receive RegExp as a key.)\r\n\r\n\t2. The matched string can be found from the third argument of function.\r\n\t\t```javascript\r\n\t\t// URL: /a/b\r\n\t\t// PATTERN: \"/:r1/*\" or \"/(?<r1>.*)/(.*)\"\r\n\t\t(cb, req, param) => {\r\n\t\t\tconsole.log(\r\n\t\t\t\tparam[0], // \"a\"\r\n\t\t\t\tparam[1], // \"b\"\r\n\t\t\t\tparam.r1, // \"a\"\r\n\t\t\t)\r\n\t\t} \r\n\t\t```\r\n\r\n\t3. priority: **Exact** > **Fuzzy** > **Reg**\r\n  \r\n  \r\n+ **Method**&lt;string&gt;\r\n\r\n\t1. **All HTTP methods** supported by [Express.js](http://expressjs.com/) also **SUPPORTED** by us.\r\n\r\n\t2. Particularly, **WS** will be used to present the websocket method.\r\n\r\n      \r\n\r\n + **MockItem**: &lt;string&gt; | &lt;object&gt; | &lt;array&gt; | &lt;function&gt;\r\n\r\n   1. string  / object / array\r\n\r\n     ```javascript\r\n     'hello world' | { hello: 'world' } | ['hello', 'world']\r\n     ```\r\n\r\n   Thanks to [mockjs](http://mockjs.com/), which provides a wonderful data generator, **ALL** its template strings will also work well in jMock. For example:\r\n\r\n     ```javascript\r\n     '@name' => \"Sharon Walker\"\r\n     { \"number|1-100\": 100 } => { \"number\": 201 }\r\n     ```\r\n\r\n   2. function\r\n\r\n      + argument: callback&lt;function&gt;, reqParams&lt;object&gt; routeParams&lt;object&gt;\r\n      + return：<void>\r\n\r\n\t```javascript\r\n\t\tfunction(cb, req, param) {\r\n\t\t\tif(req.id === 0) {\r\n\t\t\t\tcb('success')\r\n\t\t\t} else if (param.name) {\r\n\t\t\t\tcb('success')\r\n\t\t\t} else {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tcb('fail')\r\n\t\t\t\t}, 200)\r\n\t\t\t}\r\n\t\t}\r\n\t```\r\n\r\n    The callback function also receive a MockItem (**except function**) as the only argument, so the grammer of  [mockjs](http://mockjs.com/) also works. For example:\r\n\r\n     ```javascript\r\n      (cb) => {\r\n         cb({ name: '@name' })\r\n      }\r\n      // same as { name: '@name' }\r\n     ```\r\n\r\n\r\n\r\n### Run as CMD\r\n\r\n1. firstly, you should prepare a mock data file, and export it by CommonJS. For example:\r\n\r\n```javascript\r\nmodule.exports = {\r\n\t'/mock/name': {\r\n        'GET': '@name'\r\n    }\r\n}\r\n```\r\n\r\n2. then, code the command in the shell.\r\n\r\n```shell\r\njmock [--file=./mockdata.js] [--port=3000]\r\n```\r\n\r\nTwo arguments should be defined:\r\n+ mock file: **--file** or **-f**\r\n  1. e.g., --file=./mockdata.js.\r\n  2. if not asign it, the mock data will be {} by default \r\n+ port: **--port** or **-p**\r\n  1. e.g., --port=3001\r\n  2. **3000** by default\r\n\r\n     \r\n\r\n### Run as Script\r\n\r\n```javascript\r\nconst JMock = require('@8pattern/jmock')\r\n\r\nconst port = 3000\r\nconst mockData = {\r\n\t'/mock/name': {\r\n        'GET': '@name'\r\n    }\r\n}\r\n\r\nconst jmock = new JMock(data)\r\njmock.start(port)\r\n```\r\n\r\n\r\n\r\n> **ENJOY YOUR MOCK DATA NOW!**\r\n","readmeFilename":"README.md"}