{"id":31788416,"url":"https://github.com/basicallydan/interfake","last_synced_at":"2025-10-10T14:18:08.708Z","repository":{"id":52217898,"uuid":"13616310","full_name":"basicallydan/interfake","owner":"basicallydan","description":":computer: Fake APIs for prototypes \u0026 automated tests.","archived":false,"fork":false,"pushed_at":"2021-05-04T20:21:46.000Z","size":378,"stargazers_count":805,"open_issues_count":11,"forks_count":39,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-09-14T20:59:26.407Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/basicallydan.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-10-16T10:34:19.000Z","updated_at":"2025-08-02T18:24:44.000Z","dependencies_parsed_at":"2022-08-03T15:19:59.648Z","dependency_job_id":null,"html_url":"https://github.com/basicallydan/interfake","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/basicallydan/interfake","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basicallydan%2Finterfake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basicallydan%2Finterfake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basicallydan%2Finterfake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basicallydan%2Finterfake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/basicallydan","download_url":"https://codeload.github.com/basicallydan/interfake/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basicallydan%2Finterfake/sbom","scorecard":{"id":226786,"data":{"date":"2025-08-11","repo":{"name":"github.com/basicallydan/interfake","commit":"edafe065cc509512458e424ba7274dddbbc2e8e8"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":3,"reason":"Found 4/11 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENCE.md:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T03:57:37.458Z","repository_id":52217898,"created_at":"2025-08-17T03:57:37.459Z","updated_at":"2025-08-17T03:57:37.459Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279004178,"owners_count":26083688,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-10T14:18:06.532Z","updated_at":"2025-10-10T14:18:08.700Z","avatar_url":"https://github.com/basicallydan.png","language":"JavaScript","readme":"# Interfake: Quick JSON APIs\n\n[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/basicallydan/interfake?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\nInterfake is a tool which allows developers of client-side applications of *any* platform to easily create dummy HTTP APIs to develop against. Let's get started with a simple example.\n\n## Get started\n\nIf you don't want to use the JavaScript method to create your Interfake API, go read up on [all the methods](https://github.com/basicallydan/interfake/wiki). Otherwise, read on.\n\nInstall Interfake in your project.\n\n```\nnpm install interfake --save\n```\n\nLet's write a simple fake API:\n\n```js\nvar Interfake = require('interfake');\nvar interfake = new Interfake();\ninterfake.get('/whats-next').body({ next : 'more stuff '});\ninterfake.listen(3000); // The server will listen on port 3000\n```\n\nNow go to http://localhost:3000/whats-next in your browser (or [`curl`](http://curl.haxx.se)), and you will see the following:\n\n```json\n{\n\t\"next\":\"more stuff\"\n}\n```\n\nYou can also chain response properties:\n\n```js\nvar Interfake = require('interfake');\nvar interfake = new Interfake();\ninterfake.get('/whats-next').status(400).body({ error : 'such a bad request'});\ninterfake.listen(3000);\n\n/*\n# Request:\n$ curl http://localhost:3000/whats-next -X GET\n# Response:\n400\n{\n\t\"error\":\"such a bad request\"\n}\n*/\n```\n\nYou can use different HTTP methods:\n\n```js\nvar Interfake = require('interfake');\nvar interfake = new Interfake();\ninterfake.post('/next-items').status(201).body({ created : true });\ninterfake.listen(3000);\n\n/*\n# Request:\n$ curl http://localhost:3000/next-items -X POST\n# Response:\n201\n{\n\t\"created\":true\n}\n*/\n```\n\nYou can specify endpoints which should only be **created** once other ones have been hit.\n\n```js\nvar Interfake = require('interfake');\nvar interfake = new Interfake();\nvar postResponse = interfake.post('/next-items').status(201).body({ created : true });\npostResponse.creates.get('/items/1').status(200).body({ id: 1, name: 'Item 1' });\npostResponse.creates.get('/next-items').status(200).body({ items: [ { id: 1, name: 'Item 1' } ] });\ninterfake.listen(3000);\n\n/*\n# Request:\n$ curl http://localhost:3000/next-items -X POST\n# Response:\n201\n{\n\t\"created\":true\n}\n\n\n# Request:\n$ curl http://localhost:3000/items/1 -X GET\n# Response:\n200\n{\n\t\"id\":1\n\t\"name\":\"Item 1\"\n}\n*/\n```\n\nYou can even specify how endpoints should be **extended** once others have been hit.\n\n```js\nvar Interfake = require('interfake');\nvar interfake = new Interfake();\ninterfake.get('/items').status(200).body({ items: [ { id: 1, name: 'Item 1' } ] });\ninterfake.get('/items/1').status(200).body({ id: 1, name: 'Item 1' });\nvar postResponse = interfake.post('/items').status(201).body({ created : true });\npostResponse.creates.get('/items/2').status(200).body({ id: 2, name: 'Item 2' });\npostResponse.extends.get('/items').status(200).body({ items: [ { id: 2, name: 'Item 2' } ] });\ninterfake.listen(3000);\n\n/*\n# Request:\n$ curl http://localhost:3000/items -X GET\n# Response:\n200\n{\n\t\"items\" : [\n\t\t{\n\t\t\t\"id\":1\n\t\t\t\"name\":\"Item 1\"\n\t\t}\n\t]\n}\n\n# Request:\n$ curl http://localhost:3000/items -X POST\n# Response:\n201\n{\n\t\"created\":true\n}\n\n\n# Request:\n$ curl http://localhost:3000/items -X GET\n# Response:\n200\n{\n\t\"items\" : [\n\t\t{\n\t\t\t\"id\":1\n\t\t\t\"name\":\"Item 1\"\n\t\t},\n\t\t{\n\t\t\t\"id\":2\n\t\t\t\"name\":\"Item 2\"\n\t\t}\n\t]\n}\n*/\n```\n\nThere's more options, though, including delays, custom response headers, and handling query string parameters.\n\n---\n\n## API\n\nThe majority of Interfake users will probably be interested in the JavaScript API, which is covered below. However, there are in fact [three ways to use Interfake: JavaScript, on the Command Line (using static JSON files), or using an HTTP meta-API](https://github.com/basicallydan/interfake/wiki). These are covered in detail in [the Wiki](https://github.com/basicallydan/interfake/wiki).\n\n### JavaScript\n\n* `new Interfake(options)`: creates an Interfake object. Options are:\n  * `debug`: If `true`, outputs lots of annoying but helpful log messages. Default is `false`.\n  * `path`: Sets the API root path. E.g. if `api` is used then the route at `/users` will be accessible at `/api/path`\n* `#createRoute(route)`: Takes a JSON object with the following:\n  * `request`\n  * `response`\n  * `afterResponse` (optional)\n* `#listen(port, callback)`: Takes a port and starts the server, and a callback which executes when the server is running\n* `#stop()`: Stops the server if it's been started\n* `#serveStatic(path, directory)`: Serve static (usually a website) files from a certain path. This is useful for testing [SPAs](http://en.wikipedia.org/wiki/Single-page_application). ([Example use.](/examples-javascript/fluent-web-page-test.js))\n* `#loadFile(path, options)`: Load a JSON file containing an Interfake-shaped API configuration. Options includes `watch`, which, if true, means that the file loaded there will be reloaded when it changes.\n\n#### Fluent Interface\n\n* `#get|post|put|patch|delete(url)`: Create an endpoint at the specified URL. Can then be followed by each of the following, which can follow each other too e.g. `get().query().body().status().body().creates.get()` etc.\n  * `#query(queryParameters)`: An object containing query parameters to accept. Overwrites matching URL params. E.g. `get('/a?b=1').query({b:2})` means `/a?b=2` will work but `/a?b=1` will not. You can also use arrays as the value, e.g. `.query({b:[1,2]})` or even a valid ```RegExp```. All values which will be matched regardless of order.\n  * `#status(statusCode)`: Set the response status code for the endpoint\n  * `#body(body)`: Set the JSON response body of the end point\n  * `#echo(true|false)`: The response body should be the same as the request body. Can be used after `extends` too. ([Example use](/examples-javascript/fluent-echo.js))\n  * `#proxy(url|options)`: The response should be a proxy of another URL. Currently, options accepts both `url` and `headers` properties. The `headers` property specifies the headers which should be sent in the request to the proxy URL\n  * `#delay(milliseconds)`: Set the number of milliseconds to delay the response by to mimic network of processing lag\n    * Also accepts a delay range in the format 'ms..ms' e.g. '50..100'\n  * `#responseHeaders(headers)`: An object containing response headers. The keys are header names.\n  * `#creates#get|post|put|patch|delete(url)`: Specify an endpoint to create *after* the first execution of this one. API is the same as above.\n  * `#extends#get|post|put|patch|delete(url)`: Specify an endpoint to modify *after* the first execution of this one. API is the same as above. The endpoints you extend are matched based on `url` and `query`. The `status`, `body`, `delay` and `responseHeaders` are the extendable bits. Keep in mind that keys will be replaced, and arrays will be added to.\n\n## JSONP\n\nInterfake supports [JSONP](http://en.wikipedia.org/wiki/JSONP). Just put `?callback` on the end of the URLs being called.\n\n```\n$ curl http://localhost:3000/whattimeisit?callback=handleSomeJson\n```\n\n## Use Cases\n\n### Backend/API Prototype for a Single-Page Application (SPA)\n\nBy using Interfake's `.serveStatic()` method, you can serve some front-end HTML, JavaScript and CSS which uses the API you've created as the backend. Not only does this massively speed up development time by not having to have a real API, it serves as a great prototype for the real API, and avoids having to mock requests. This is my most common use for Interfake.\n\n### Backend for a Mobile Application\n\nIf you'd like to develop an API-driven mobile application you might not yet have a finished API available. This is a perfect example of where Interfake is useful. You can quickly mock up some dummy APIs and work on the mobile application. In parallel, perhaps another developer will be creating the real API, or you could create it later.\n\n### Automated Testing\n\nYou can use Interfake to create dummy APIs which use data from your test setup with the HTTP method above, or by using a static set of test data. If you're writing your test suite using a NodeJS library, you can use the JavaScript API.\n\nThe HTTP API is particularly useful for developing iOS Applications which uses Automated tests written in JavaScript, or developing Node.js applications which rely on external APIs.\n\nFor an example of how to do this, please see the [web page test example](/examples-javascript/fluent-web-page-test.js).\n\n### Regular Expressions for URLs\n\nRegular expressions can be used to specify endpoint URLs in two different ways depending on which interface you use. For the fluent API, you simply put a JavaScript regular expression as the URL, e.g.\n\n```javascript\ninterfake.get(/\\/regular\\/expression/).status(200);\n```\n\nThis is also supported when using `createRoute`, but since JSON does not support regular expressions, a different method must be used here:\n\n```json\n[\n\t{\n\t\t\"request\": {\n\t\t\t\"url\": {\n\t\t\t\t\"pattern\" : \"/what/the/.*\",\n\t\t\t\t\"regexp\" : true\n\t\t\t},\n\t\t\t\"method\": \"get\"\n\t\t},\n\t\t\"response\": {\n\t\t\t\"code\": 200\n\t\t}\n\t}\n]\n```\n\nThe pattern specified in the `request.url.pattern` string will be parsed and treated as a regular expression.\n\n### Proxying another API\n\nThere are a number of reasons you might want to proxy another API. Three of the more common ones are:\n\n* It requires some authorization options which you want to hide from a client-side script but nonetheless want to use every time you make a request\n* There is a [cross-origin request sharing (CORS)](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) issue which prevents your client-side code from using the API\n* It requires some tedious header setup\n\nInterfake allows you to proxy another URL quite easily and also specify any headers you like while doing so, using the `proxy` option.\n\n```js\ninterfake.get('/github-issues').proxy('https://api.github.com/repos/basicallydan/interfake/tags');\n```\n\nThe example above creates a simple proxy against the URL `https://api.github.com/repos/basicallydan/interfake/tags` and will return whatever a public, non-authorized user will see. However, consider an endpoint which requires authorization.\n\n```js\ninterfake.get('/github-issues').proxy({\n\turl: 'https://api.github.com/repos/basicallydan/interfake/tags',\n\theaders: {\n\t\t'Authorization': 'Token qoinfiu13jfcikwkhf1od091dj0'\n\t}\n});\n```\n\nThis example uses an authorization token to authorize the request. This is one of the common use-cases. However, the first one will easily solve CORS issues, and any other headers apart from `Authorization` can be specified instead.\n\n### Echoing the request body\n\nThis can be easily achieved using the `.echo()` method in the fluent interface, or by specifying the following for route options:\n\n```json\n{\n\trequest : {\n\t\turl : '/echo',\n\t\tmethod: 'post'\n\t},\n\tresponse : {\n\t\techo : true\t\n\t}\n}\n```\n\nA request to the `/echo` endpint will return whatever body it is sent. You can see more examples of this in the [examples folder](/examples-javascript/).\n\n### Creating a static API\n\nIf you have a website or mobile application which only needs static data, deploy Interfake to a server somewhere with a JSON file serving up the data, and point your application at it.\n\n## Compatibility\n\nI tested this on my Mac. If you have trouble on Windows or any other platform, [raise an issue](https://github.com/basicallydan/interfake/issues).\n\n## Version History\n\n* 1.19.0: Using the npm version of `deepmerge`, not my fork on gh. Exposing underlying express app as instance variable `expressApp`\n* 1.18.0: Array support in query string params added thanks to [@roychoo](https://github.com/roychoo). Also, fixed a couple of tests which broke in Node 5.0.\n* 1.17.0: Regular expressions can now be specified in JSON route files and in the normal JavaScript API (`.createRoute()`) using `{ url : { pattern : '', regexp : true } }`\n* 1.16.0: Added automatic `OPTIONS` support for any routes specified (e.g. if `GET` has been defined then `OPTIONS` will say so. Also includes `access-control-allow-origin`)\n* 1.15.0: Added `.echo` or `{ echo : true }` support for response. Now, the response body can an echo of the request body.\n* 1.14.0: Fixed `serveStatic` but also accidental new feature. Now, 404 responses include some text: the default express text too.\n* 1.13.0: Regex URL support\n* 1.12.1: Bug fix from [Alexander Pope](https://github.com/popeindustries), proxy and query params not playing well together\n* 1.12.0: Proxy support\n* 1.11.0: Config reload\n* 1.10.0: Support for PATCH\n* 1.9.2: Updated deepmerge dependency, since it included a bug\n* 1.9.1: Updated dependencies, and fixed a bug where `.serveStatic` was not working on Windows because of the directory being wrong.\n* 1.9.0: Created the `.extends` methods to extend existing endpoints\n* 1.8.2: Bug fix for Windows - paths were screwed up\n* 1.8.1: Bug fix for responseheaders\n* 1.8.0: Querystring parameter values can now be regular expressions\n* 1.7.2: Fixed a bug where `.delay()` was not allowing chaining\n* 1.7.1: Added ability to set a root path for the API only (skipped 1.7.0 which was a bit broken)\n* 1.6.2: Can add a callback to `listen` so that you know when the server has started (by [bruce-one](https://github.com/bruce-one))\n* 1.6.1: Upgraded to Express 4.0.0 (thanks to [Sebastian Schürmann](https://github.com/sebs)).\n* 1.6.0: Custom response headers (thanks to [Sebastian Schürmann](https://github.com/sebs)).\n* 1.5.0: Can now use querystring params (thanks to [rajit](https://github.com/rajit)). Massive.\n* 1.4.0: Can specify delay range using `delay(10..50)` (by [bruce-one](https://github.com/bruce-one))\n* 1.3.0: Can mimic slow responses using `delay()` (by [bruce-one](https://github.com/bruce-one))\n* 1.2.0: Added ability to do static files\n* 1.1.1: Fixed the response to `POST /_request` to be a 201, and `POST /_requests` is now the path used\n* 1.1.0: Added the fluent interface for easier creation of endpoints\n* 1.0.0: Backwards-incompatible changes for JavaScript API, now creating an `Interfake` instance\n* 0.2.0: Added JSONP support\n* 0.1.0: Support for creating mocked JSON APIs using HTTP, JavaScript or command line\n\n## Contribute\n\nInterfake is a labour of love, created for front-end and mobile developers to increase their prototyping and development speeds. If you can contribute by getting through some issues, I would be very grateful. Please read more about how to contribute in the [CONTRIBUTING.md](https://github.com/basicallydan/interfake/blob/master/CONTRIBUTING.md) document.\n\nIt's important that the tests all pass so we can keep this little badge green:\n\n[![Travis](http://img.shields.io/travis/basicallydan/interfake.svg)](https://travis-ci.org/basicallydan/interfake)\n\n\u003c3 Open Source!\n\n[![I Love Open Source](http://www.iloveopensource.io/images/logo-lightbg.png)](http://www.iloveopensource.io/projects/5319884587659fce66000943)\n\n## Dependencies\n\n* [express](https://github.com/visionmedia/express)\n* [express body-parser](https://github.com/expressjs/body-parser)\n* [connect-json](https://github.com/dtinth/connect-json)\n* [commander](https://github.com/visionmedia/commander.js/)\n* [core-util-is](https://github.com/isaacs/core-util-is)\n* [merge](https://github.com/yeikos/js.merge)\n* [basicallydan/deepmerge](https://github.com/basicallydan/deepmerge) forked from [nrf110/deepmerge](https://github.com/nrf110/deepmerge)\n\n## Works well with\n\n* [Mocha](http://mochajs.org/) - the test framework\n* [Zombie.js](http://zombie.labnotes.org/) - the Node.js-powered headless web browser\n\n## Thank yous\n\n[Alun](https://github.com/4lun) for reading this readme.\n\n## Author \u0026 Contributors\n\n* [Dan Hough](https://github.com/basicallydan) ([Twitter](https://twitter.com/basicallydan) | [Website](http://danielhough.co.uk))\n* [bruce-one](https://github.com/bruce-one)\n* [rajit](https://github.com/rajit)\n* [Sebastian Schürmann](https://github.com/sebs)\n* [roychoo](https://github.com/roychoo)\n\n## Future work\n\n* Create a guide/some examples for how to integrate this with existing test frameworks, whether written in JavaScript or not\n* Improve the templating, so that a response might include a repeated structure with an incrementing counter or randomized data\n","funding_links":[],"categories":["Packages","包"],"sub_categories":["Web frameworks"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasicallydan%2Finterfake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbasicallydan%2Finterfake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasicallydan%2Finterfake/lists"}