# Description

`jax` is a library for handling AJAX requests and responses. It does not bundle any commands. It is only a collection of modules.


# Installation

`jax` is available as an `npm` package. You can install it via the npm package `@ephox/jax`

## Install from npm

`npm install @ephox/jax`.

# Using the API


`jax` supports several methods, content types, and response types. More specifically,

Methods: GET, POST, PUT, DELETE
Content Types: none, form, json, plain, html
Response Types: json, blob, text, html, xml

In addition, `credentials` can be sent with the request. More information can be found [here](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).

The `ephox.jax.api.Ajax` APIs provide the various methods for making AJAX requests. They all return a `LazyValue` (see [katamari](https://www.npmjs.com/package/@ephox/katamari)) which is a promise-like data structure with `get`, `map`, and `isReady` functions. The APIs also take an additional parameter at the end for any custom request headers, which defaults to `{}` if it is not provided.

`ContentType`, `ResponseType`, and `Credentials` are specified using the constructors inside `ephox.jax.api.ContentType`, `ephox.jax.api.ResponseType`, and `ephox.jax.api.Credentials` respectively.

## GET Requests

`Ajax.get(url, responseType, credentials, _custom)`

This fires a GET request with the specified response type. The content type is sent as `none`.

```
Ajax.get(
  'http://localhost/server/get/1',
  ResponseType.json(),
  Credentials.none(),
  { }
).get(function (result) {
  // result is a result, so you need to fold over it for Err or Succ(x)
  result.fold(function (err) {
    console.error('Server error', err);
  }, function (val) {
    console.log('Get response', val);
  })
});
```

## POST Requests

`Ajax.post(url, contentType, responseType, credentials, _custom)`

This fires a POST request with the specified response type and content type.

```
Ajax.post(
  'http://localhost/server/post',
  ContentType.json({
    'send-data': '10'
  }),
  ResponseType.xml(),
  Credentials.none(),
  { }
)).get(function (result) {
  // result is a result, so you need to fold over it for Err or Succ(x)
  result.fold(function (err) {
    console.error('Server error', err);
  }, function (xml) {
    console.log('Post response', xml);
  })
});
```

## PUT Requests

`Ajax.put(url, contentType, responseType, credentials, _custom)`

This fires a PUT request with the specified response type and content type.

```
Ajax.put(
  'http://localhost/server/put',
  ContentType.json({
    'send-data': '10'
  }),
  ResponseType.json(),
  Credentials.none(),
  { }
)).get(function (result) {
  // result is a result, so you need to fold over it for Err or Succ(x)
  result.fold(function (err) {
    console.error('Server error', err);
  }, function (val) {
    console.log('Put response', val);
  })
});
```

## DELETE requests

`Ajax.del(url, responseType, credentials, _custom)`

This fires a DELETE request with the specified response type.

```
Ajax.get(
  'http://localhost/server/del/1',
  ResponseType.json(),
  Credentials.none(),
  { }
).get(function (result) {
  // result is a result, so you need to fold over it for Err or Succ(x)
  result.fold(function (err) {
    console.error('Server error', err);
  }, function (val) {
    console.log('Delete response', val);
  })
});
```

# Running Tests

`$ yarn test`

These tests require [bedrock](https://www.npmjs.com/package/@ephox/bedrock) and chrome.
