# Upgrading to 4.0.0

## Dropped bower support

Fakerest no longer supports bower. You can still use it in your project by installing it via npm:

```bash
npm install fakerest
```

## Renamed `Server` to `SinonAdapter`

The `Server` class has been renamed to `SinonAdapter` and now expects a configuration object instead of a URL.

```diff
import sinon from 'sinon';
-import { Server } from 'fakerest';
+import { SinonAdapter } from 'fakerest';
import { data } from './data';

-const server = new Server('http://myapi.com');
-server.init(data);
+const server = new SinonAdapter({ baseUrl: 'http://myapi.com', data });
const server = sinon.fakeServer.create();
server.respondWith(server.getHandler());
```

## Renamed `FetchServer` to `FetchMockAdapter`

The `FetchServer` class has been renamed to `FetchMockAdapter` and now expects a configuration object instead of a URL.

```diff
import fetchMock from 'fetch-mock';
-import { FetchServer } from 'fakerest';
+import { FetchMockAdapter } from 'fakerest';
import { data } from './data';

-const server = new FetchServer('http://myapi.com');
-server.init(data);
+const server = new FetchMockAdapter({ baseUrl: 'http://myapi.com', data });
fetchMock.mock('begin:http://myapi.com', server.getHandler());
```

## Constructor Of `Collection` Takes An Object

```diff
import { Collection } from 'fakerest';

-const posts = new Collection([
-    { id: 1, title: 'baz' },
-    { id: 2, title: 'biz' },
-    { id: 3, title: 'boz' },
-]);
+const posts = new Collection({
+    items: [
+        { id: 1, title: 'baz' },
+        { id: 2, title: 'biz' },
+        { id: 3, title: 'boz' },
+    ],
+});
```

## `addCollection` is now `adapter.server.addCollection`

```diff
import fetchMock from 'fetch-mock';
-import { FetchServer } from 'fakerest';
+import { FetchMockAdapter } from 'fakerest';
import { posts } from './posts';

-const server = new FetchServer('http://myapi.com');
-server.addCollection('posts', posts);
-fetchMock.mock('begin:http://myapi.com', server.getHandler());
+const adapter = new FetchMockAdapter({ baseUrl: 'http://myapi.com', data });
+adapter.server.addCollection('posts', posts);
+fetchMock.mock('begin:http://myapi.com', adapter.getHandler());
```

## Request and Response Interceptors Have Been Replaced By Middlewares

Fakerest used to have request and response interceptors. We replaced those with middlewares. They allow much more use cases.

Migrate your request interceptors to middlewares passed when building the handler:

```diff
- const myRequestInterceptor = function(request) {
+ const myMiddleware = async function(context, next) {
    var start = (request.params._start - 1) || 0;
    var end = request.params._end !== undefined ? (request.params._end - 1) : 19;
    request.params.range = [start, end];
-   return request; // always return the modified input
+   return next(context);
};

-restServer.addRequestInterceptor(myRequestInterceptor);
+const handler = new getMswHandler({
+   baseUrl: 'http://my.custom.domain',
+   data,
+   middlewares: [myMiddleware],
});
```

Migrate your response interceptors the same way.