Fake APIs for prototypes & automated tests.

Overview

Interfake: Quick JSON APIs

Gitter

Interfake 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.

Get started

If you don't want to use the JavaScript method to create your Interfake API, go read up on all the methods. Otherwise, read on.

Install Interfake in your project.

npm install interfake --save

Let's write a simple fake API:

var Interfake = require('interfake');
var interfake = new Interfake();
interfake.get('/whats-next').body({ next : 'more stuff '});
interfake.listen(3000); // The server will listen on port 3000

Now go to http://localhost:3000/whats-next in your browser (or curl), and you will see the following:

{
	"next":"more stuff"
}

You can also chain response properties:

var Interfake = require('interfake');
var interfake = new Interfake();
interfake.get('/whats-next').status(400).body({ error : 'such a bad request'});
interfake.listen(3000);

/*
# Request:
$ curl http://localhost:3000/whats-next -X GET
# Response:
400
{
	"error":"such a bad request"
}
*/

You can use different HTTP methods:

var Interfake = require('interfake');
var interfake = new Interfake();
interfake.post('/next-items').status(201).body({ created : true });
interfake.listen(3000);

/*
# Request:
$ curl http://localhost:3000/next-items -X POST
# Response:
201
{
	"created":true
}
*/

You can specify endpoints which should only be created once other ones have been hit.

var Interfake = require('interfake');
var interfake = new Interfake();
var postResponse = interfake.post('/next-items').status(201).body({ created : true });
postResponse.creates.get('/items/1').status(200).body({ id: 1, name: 'Item 1' });
postResponse.creates.get('/next-items').status(200).body({ items: [ { id: 1, name: 'Item 1' } ] });
interfake.listen(3000);

/*
# Request:
$ curl http://localhost:3000/next-items -X POST
# Response:
201
{
	"created":true
}


# Request:
$ curl http://localhost:3000/items/1 -X GET
# Response:
200
{
	"id":1
	"name":"Item 1"
}
*/

You can even specify how endpoints should be extended once others have been hit.

var Interfake = require('interfake');
var interfake = new Interfake();
interfake.get('/items').status(200).body({ items: [ { id: 1, name: 'Item 1' } ] });
interfake.get('/items/1').status(200).body({ id: 1, name: 'Item 1' });
var postResponse = interfake.post('/items').status(201).body({ created : true });
postResponse.creates.get('/items/2').status(200).body({ id: 2, name: 'Item 2' });
postResponse.extends.get('/items').status(200).body({ items: [ { id: 2, name: 'Item 2' } ] });
interfake.listen(3000);

/*
# Request:
$ curl http://localhost:3000/items -X GET
# Response:
200
{
	"items" : [
		{
			"id":1
			"name":"Item 1"
		}
	]
}

# Request:
$ curl http://localhost:3000/items -X POST
# Response:
201
{
	"created":true
}


# Request:
$ curl http://localhost:3000/items -X GET
# Response:
200
{
	"items" : [
		{
			"id":1
			"name":"Item 1"
		},
		{
			"id":2
			"name":"Item 2"
		}
	]
}
*/

There's more options, though, including delays, custom response headers, and handling query string parameters.


API

The 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. These are covered in detail in the Wiki.

JavaScript

  • new Interfake(options): creates an Interfake object. Options are:
    • debug: If true, outputs lots of annoying but helpful log messages. Default is false.
    • path: Sets the API root path. E.g. if api is used then the route at /users will be accessible at /api/path
  • #createRoute(route): Takes a JSON object with the following:
    • request
    • response
    • afterResponse (optional)
  • #listen(port, callback): Takes a port and starts the server, and a callback which executes when the server is running
  • #stop(): Stops the server if it's been started
  • #serveStatic(path, directory): Serve static (usually a website) files from a certain path. This is useful for testing SPAs. (Example use.)
  • #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.

Fluent Interface

  • #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.
    • #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.
    • #status(statusCode): Set the response status code for the endpoint
    • #body(body): Set the JSON response body of the end point
    • #echo(true|false): The response body should be the same as the request body. Can be used after extends too. (Example use)
    • #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
    • #delay(milliseconds): Set the number of milliseconds to delay the response by to mimic network of processing lag
      • Also accepts a delay range in the format 'ms..ms' e.g. '50..100'
    • #responseHeaders(headers): An object containing response headers. The keys are header names.
    • #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.
    • #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.

JSONP

Interfake supports JSONP. Just put ?callback on the end of the URLs being called.

$ curl http://localhost:3000/whattimeisit?callback=handleSomeJson

Use Cases

Backend/API Prototype for a Single-Page Application (SPA)

By 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.

Backend for a Mobile Application

If 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.

Automated Testing

You 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.

The 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.

For an example of how to do this, please see the web page test example.

Regular Expressions for URLs

Regular 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.

interfake.get(/\/regular\/expression/).status(200);

This is also supported when using createRoute, but since JSON does not support regular expressions, a different method must be used here:

[
	{
		"request": {
			"url": {
				"pattern" : "/what/the/.*",
				"regexp" : true
			},
			"method": "get"
		},
		"response": {
			"code": 200
		}
	}
]

The pattern specified in the request.url.pattern string will be parsed and treated as a regular expression.

Proxying another API

There are a number of reasons you might want to proxy another API. Three of the more common ones are:

  • 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
  • There is a cross-origin request sharing (CORS) issue which prevents your client-side code from using the API
  • It requires some tedious header setup

Interfake allows you to proxy another URL quite easily and also specify any headers you like while doing so, using the proxy option.

interfake.get('/github-issues').proxy('https://api.github.com/repos/basicallydan/interfake/tags');

The 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.

interfake.get('/github-issues').proxy({
	url: 'https://api.github.com/repos/basicallydan/interfake/tags',
	headers: {
		'Authorization': 'Token qoinfiu13jfcikwkhf1od091dj0'
	}
});

This 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.

Echoing the request body

This can be easily achieved using the .echo() method in the fluent interface, or by specifying the following for route options:

{
	request : {
		url : '/echo',
		method: 'post'
	},
	response : {
		echo : true	
	}
}

A request to the /echo endpint will return whatever body it is sent. You can see more examples of this in the examples folder.

Creating a static API

If 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.

Compatibility

I tested this on my Mac. If you have trouble on Windows or any other platform, raise an issue.

Version History

  • 1.19.0: Using the npm version of deepmerge, not my fork on gh. Exposing underlying express app as instance variable expressApp
  • 1.18.0: Array support in query string params added thanks to @roychoo. Also, fixed a couple of tests which broke in Node 5.0.
  • 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 } }
  • 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)
  • 1.15.0: Added .echo or { echo : true } support for response. Now, the response body can an echo of the request body.
  • 1.14.0: Fixed serveStatic but also accidental new feature. Now, 404 responses include some text: the default express text too.
  • 1.13.0: Regex URL support
  • 1.12.1: Bug fix from Alexander Pope, proxy and query params not playing well together
  • 1.12.0: Proxy support
  • 1.11.0: Config reload
  • 1.10.0: Support for PATCH
  • 1.9.2: Updated deepmerge dependency, since it included a bug
  • 1.9.1: Updated dependencies, and fixed a bug where .serveStatic was not working on Windows because of the directory being wrong.
  • 1.9.0: Created the .extends methods to extend existing endpoints
  • 1.8.2: Bug fix for Windows - paths were screwed up
  • 1.8.1: Bug fix for responseheaders
  • 1.8.0: Querystring parameter values can now be regular expressions
  • 1.7.2: Fixed a bug where .delay() was not allowing chaining
  • 1.7.1: Added ability to set a root path for the API only (skipped 1.7.0 which was a bit broken)
  • 1.6.2: Can add a callback to listen so that you know when the server has started (by bruce-one)
  • 1.6.1: Upgraded to Express 4.0.0 (thanks to Sebastian Schürmann).
  • 1.6.0: Custom response headers (thanks to Sebastian Schürmann).
  • 1.5.0: Can now use querystring params (thanks to rajit). Massive.
  • 1.4.0: Can specify delay range using delay(10..50) (by bruce-one)
  • 1.3.0: Can mimic slow responses using delay() (by bruce-one)
  • 1.2.0: Added ability to do static files
  • 1.1.1: Fixed the response to POST /_request to be a 201, and POST /_requests is now the path used
  • 1.1.0: Added the fluent interface for easier creation of endpoints
  • 1.0.0: Backwards-incompatible changes for JavaScript API, now creating an Interfake instance
  • 0.2.0: Added JSONP support
  • 0.1.0: Support for creating mocked JSON APIs using HTTP, JavaScript or command line

Contribute

Interfake 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 document.

It's important that the tests all pass so we can keep this little badge green:

Travis

<3 Open Source!

I Love Open Source

Dependencies

Works well with

  • Mocha - the test framework
  • Zombie.js - the Node.js-powered headless web browser

Thank yous

Alun for reading this readme.

Author & Contributors

Future work

  • Create a guide/some examples for how to integrate this with existing test frameworks, whether written in JavaScript or not
  • Improve the templating, so that a response might include a repeated structure with an incrementing counter or randomized data
Comments
  • Regular expression doesn't work for question symbol

    Regular expression doesn't work for question symbol

    I tried to use regular expression in such way: interfake.get(//asofdate=[0-9]?exp/).status(200);

    i expect the url to be availiable in such way: /asofdate=1?exp

    but because of question mark it is unavailiable.

    also i tried it in JSON, like so:

    "url": { "pattern" : "/asofdate=[0-9]?exp", "regexp" : true }

    But it doesn't work too.

    opened by AlionaKastsevich 14
  • Add support for handling query params

    Add support for handling query params

    We wanted to use interfake to be able to handle requests like:

    GET /something?query=12
    

    But of course it was failing to register this correctly. This pull request adds support for query parameters by allowing you to call createRoute as follows:

    interfake.createRoute({
        request: {
            url: '/something',
            query: {
                query: 12
            },
            method: 'get'
        },
        response: {
            status: 200,
            body: { response: 'body' }
        }
    });
    

    Commit message: Added createRouteHash() to maintain canonical form of a request. Use lookup table to store expected responses, with route-hash as key. Add tests to confirm query params work. All tests pass, with modifications. Added afterEach() to ensure interfake.stop() is called after each test, even if the test fails.

    planned-feature 
    opened by rajit 8
  • [in progress] simple regexp support for json specified endpoints

    [in progress] simple regexp support for json specified endpoints

    Hey, this one is more of a feature discussion than a real PR at the moment. So I realized I needed regexp endpoints and I was using the JSON method, and couldn't find any support for regexps this way (only the JS method?), so I did this really rough solution to be able to do that. And my JSON would look like this

    [
      {
        "request": {
          "url": "regexp=\/some\/v0\/endpoint/(.*)",
          "method": "get"
        },
        "response": {
          "code": 200,
          "body": {}
        }
      }
    ]
    

    This is probably in the completely wrong place. Also it should probably be in the form a property e.g. regexp: true than a prefix. Thoughts?

    opened by javoire 7
  • serveStatic not working

    serveStatic not working

    so here's my code, taken straight from the documentation:

    var Interfake   = require( 'interfake' );
    var interfake   = new Interfake();
    var filePath    = path.join(__dirname, './');
    
    interfake.serveStatic( '/static', filePath );
    interfake.listen( 3000 );
    

    but it doesn't work as expected. whenever i try to access index.html in the browser (http://localhost:3000/static/index.html), nothing happens.

    here's my directory structure:

    test.js
    index.html
    

    and here's how i'm running it:

    node test.js

    i also tried running the web page example (fluent-web-page-test.js), but after installing all dependencies it still won't work.

    here's the output from the terminal:

    ChickenMaster:interfake john$ node examples-javascript/fluent-web-page-test.js
    
    /Users/john/Sites/interfake/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:238
    var nonInheritedTags = new Set([
                               ^
    ReferenceError: Set is not defined
        at Object.<anonymous> (/Users/john/Sites/interfake/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:238:28)
        at Module._compile (module.js:456:26)
        at Object.Module._extensions..js (module.js:474:10)
        at Module.load (module.js:356:32)
        at Function.Module._load (module.js:312:12)
        at Module.require (module.js:364:17)
        at require (module.js:380:17)
        at Object.<anonymous> (/Users/john/Sites/interfake/node_modules/zombie/node_modules/jsdom/lib/jsdom/living/index.js:8:1)
        at Module._compile (module.js:456:26)
        at Object.Module._extensions..js (module.js:474:10)
        at Module.load (module.js:356:32)
        at Function.Module._load (module.js:312:12)
        at Module.require (module.js:364:17)
        at require (module.js:380:17)
        at Object.<anonymous> (/Users/john/Sites/interfake/node_modules/zombie/lib/dom/index.js:5:11)
        at Module._compile (module.js:456:26)
    ChickenMaster:interfake john$ 
    

    am i doing something wrong or is this a bug?

    opened by goodpixels 6
  • createRoute() has issues with the param property in the request json

    createRoute() has issues with the param property in the request json

    In the example wiki, this snippet is causing a 404 when GETting the resource:

    interfake.createRoute({ request: { url: '/whats-next', method: 'get', query: { // Optional querystring parameters page: 2 } }, response: { code: 200, // HTTP Status Code delay: 50, // Delay in milliseconds body: { // JSON Body Response next:'more stuff' }, headers: { // Optional headers 'X-Powered-By': 'Interfake' } } });

    It seems to work when I take the query property out of the request graph.

    opened by rotovibe 5
  • Adding of get request array params support

    Adding of get request array params support

    was trying to have array params in the query

    "query" : {
      "pages": ["page", "page2"]
    }
    

    thus, submitting this PR to have this functionality. let me know if it is ok

    opened by roychoo 5
  • fix copying of proxied query strings

    fix copying of proxied query strings

    It's not possible to access value while iterating over Object.keys, so all proxied query strings have value of 0. This fix correctly copies the query parameter values.

    opened by popeindustries 4
  • Unable to get interfake running on my windows machine

    Unable to get interfake running on my windows machine

    All method return 404 with the error "Cannot GET /whats-next"

    image

    I have a fork here with a visual studio solution for debugging here (https://github.com/tharris29/interfake)

    opened by tharris29 4
  • RegExp Support for paths

    RegExp Support for paths

    Test case:

            it('should create one GET endpoint with a RegExp path', function (done) {
                interfake = new Interfake({debug:true});
                interfake.get(/\/fluent\/.*/);
                interfake.listen(3000);
    
                request({ url : 'http://localhost:3000/fluent/whatever', json : true }, function (error, response, body) {
                    assert.equal(response.statusCode, 200);
                    done();
                });
            });
    
    planned-feature 
    opened by basicallydan 3
  • Docs on formatting

    Docs on formatting

    Hi

    It's hard to submit a patch without info on file formatting! Why not create a little doc or better a check with grunt. I could create that, but it would be changing the build

    planned-admin 
    opened by sebs 3
  • interfake without parameters gives a unhandled error

    interfake without parameters gives a unhandled error

    clu-2:creativecommonsify.com Admin$ ./node_modules/.bin/interfake
    
    events.js:72
            throw er; // Unhandled 'error' event
                  ^
    Error: listen EADDRINUSE
        at errnoException (net.js:901:11)
        at Server._listen2 (net.js:1039:14)
        at listen (net.js:1061:10)
        at Server.listen (net.js:1127:5)
        at Function.app.listen (/Users/Admin/projects/creativecommonsify.com/node_modules/interfake/node_modules/express/lib/application.js:533:24)
        at Interfake.listen (/Users/Admin/projects/creativecommonsify.com/node_modules/interfake/lib/server.js:139:16)
        at Object.<anonymous> (/Users/Admin/projects/creativecommonsify.com/node_modules/interfake/index.js:27:11)
        at Module._compile (module.js:456:26)
        at Object.Module._extensions..js (module.js:474:10)
        at Module.load (module.js:356:32)
    
    opened by sebs 3
  • Bump merge from 1.2.1 to 2.1.1

    Bump merge from 1.2.1 to 2.1.1

    Bumps merge from 1.2.1 to 2.1.1.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Match request body on POST

    Match request body on POST

    POST takes only url as a parameter, it would be great if it can take request body also, so it can give different responses for different request body.

    Expected post implementation: interfake.post({url: '/next-items', body: {}}).status(201).body({ created : true });

    opened by iamsumanth 0
  • extends example uncorrect

    extends example uncorrect

    When I run the examples-javascript of extends:

    https://github.com/basicallydan/interfake/blob/master/examples-javascript/fluent-extends.js

    I got the result:

    {
      "items": [
        {
          "id": 2,
          "name": "Item 2"
        }
      ]
    }
    

    But when I add a comma like:

    postResponse.extends.get('/items').status(200).body({ items: [ ,{ id: 2, name: 'Item 2' } ] });
    

    Then it works like the annotation. Is there something wrong with the example? I have checked the version: 1.19.0

    opened by csvwolf 0
  • Automatic CORS preflight breaks when credentials are used.

    Automatic CORS preflight breaks when credentials are used.

    Automatic CORS preflight (added in 1.16.0) always returns header 'Access-Control-Allow-Origin': '*'. When using credentials, '*' is not accepted by browsers, and a specific allowed origin is needed instead.

    When I define the options endpoint myself and try to return a specific origin, it appears that the automatic preflight takes precedence so the response still has '*'. I can't update above 1.15.0 because of this.

    • If I specify my own options response for an endpoint, that should be used instead of the automatic one.
    • I should be able to turn off the automatic CORS preflight (completely and/or per-endpoint).

    EDIT: there are 2 places when the Access-Control-* headers are relevant - OPTIONS request, and in responseHeaders on a GET response. To get CORS with credentials working, I had to make sure I returned the right allowed origin and other access control headers from both of those.

    I forget whether I tested overriding the default CORS in both these places at once.

    opened by davidmason 1
  • Support other Content-Types

    Support other Content-Types

    Hello,

    I'd like to use interfake to simulate an API I'm implementing but I think I can't use more than one Content-Type for the same HTTP resource. In my case, I'd like to answer the same data but in different formats, depending on Accept header sent by client -- this is needed because some of my API clients use msgpack to serialize data and others simply use JSON.

    I've done a quick look into interfake's code but as I'm new to nodejs world, I didn't start implementing this feature by now, but I think we'll need to modify expectationsLookup and Route.simpleHash to implement this feature. What do you think?

    Note: thanks for writing this awesome project! :)

    looking-for-contributor 
    opened by turicas 4
Owner
Daniel Hough
Software engineer, open-source enthusiast. Works at @Junglescout.
Daniel Hough
Framework for setting up RESTful JSON APIs with NodeJS.

Restberry works with both Express and Restify! Framework for setting up RESTful JSON APIs with NodeJS. Define your models and setup CRUD API calls wit

Restberry 117 Jul 5, 2021
A system for sharing tests between students. In RepoProvas anyone can look up old tests for their subjects and teachers or send old tests to help other students!

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

Rui Neto 6 May 10, 2022
Generate deterministic fake values: The same input will always generate the same fake-output.

import { copycat } from '@snaplet/copycat' copycat.email('foo') // => '[email protected]' copycat.email('bar') // => 'Thurman.Schowalter668@

Snaplet 201 Dec 30, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
Demo Selenium JavaScript E2E tests (end-to-end web browser automation tests)

Demo Selenium JavaScript E2E tests (end-to-end web browser automation tests)

Joel Parker Henderson 1 Oct 9, 2021
SAP Community Code Challenge: This repository contains an empty OpenUI5 application and end-to-end tests written with wdi5. Take part in the challenge and develop an app that passes the tests.

SAP Community Code Challenge - UI5 The change log describes notable changes in this package. Description This repository is the starting point for the

SAP Samples 8 Oct 24, 2022
The most advanced responsive front-end framework in the world. Quickly create prototypes and production code for sites that work on any kind of device.

Install | Documentation | Releases | Contributing Foundation is the most advanced responsive front-end framework in the world. Quickly go from prototy

Foundation 29.4k Jan 4, 2023
A Web UI toolkit for creating rapid prototypes, experiments and proof of concept projects.

MinimalComps2 A Web UI tookkit for creating rapid prototypes, experiments and proof of concept projects. The site: https://www.minimalcomps2.com/ Full

Keith Peters 32 Apr 18, 2022
JSPro is nothing but JavaScript Prototypes! The publisher is too lazy to write full name that's why it's just JSPro.

JSPro is nothing but JavaScript Prototypes! The publisher is too lazy to write full name that's why it's just JSPro. Whatever, it's a library of hundreds of awesome JavaScript Prototypes (you may know it as dot function) for lazy programmers. Just install the package with a little effort and leave the blames for the publisher.

Jafran Hasan 2 Mar 10, 2022
we learn the whole concept of JS including Basics like Object, Functions, Array etc. And Advance JS - Understanding DOMs, JQuery, Ajax, Prototypes etc.

JavaScript-for-Complete-Web Development. we learn the whole concept of JS including Basics like Object, Functions, Array etc. And Advance JS - Underst

prasam jain 2 Jul 22, 2022
The most advanced responsive front-end framework in the world. Quickly create prototypes and production code for sites that work on any kind of device.

Install | Documentation | Releases | Contributing Foundation is the most advanced responsive front-end framework in the world. Quickly go from prototy

Foundation 29.4k Jan 4, 2023
Social-Feeds-APIs - REST APIs to build social media sites.

express4.17.1-in-docker EXPRESS 4.17 SPA IMPORTANT NOTES: 1. Make sure you follow the steps mentioned under "PROJECT START STEPS" and ensure that the

Patel Rohan 1 Jan 3, 2022
BootstrapVue provides one of the most comprehensive implementations of Bootstrap v4 for Vue.js. With extensive and automated WAI-ARIA accessibility markup.

With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive impl

BootstrapVue 14.2k Jan 4, 2023
🌍📖 A readable, automated, and optimized (5 kb) internationalization for JavaScript

Linguijs ?? ?? A readable, automated, and optimized (5 kb) internationalization for JavaScript Documentation · Documentation 2.x · Quickstart · Exampl

Lingui 3.5k Jan 2, 2023
Free, open-source crypto trading bot, automated bitcoin / cryptocurrency trading software, algorithmic trading bots. Visually design your crypto trading bot, leveraging an integrated charting system, data-mining, backtesting, paper trading, and multi-server crypto bot deployments.

Free, open-source crypto trading bot, automated bitcoin / cryptocurrency trading software, algorithmic trading bots. Visually design your crypto trading bot, leveraging an integrated charting system, data-mining, backtesting, paper trading, and multi-server crypto bot deployments.

Superalgos 3.1k Jan 1, 2023
Automated backups to Dropbox for Obsidian.

Obsidian Aut-O-Backups Automated backups to Dropbox of your entire vault every 20 minutes. Backups are stored here: /Apps/Obsidian Backups/ Underneat

Ryan McQuen 51 Dec 28, 2022