Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade FakeRest to 4.0 #9908

Merged
merged 10 commits into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions examples/demo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,13 @@
"clsx": "^2.1.1",
"data-generator-retail": "^5.0.0-alpha.0",
"date-fns": "^3.6.0",
"fakerest": "^3.0.0",
"fakerest": "^4.0.0-beta.0",
"fetch-mock": "~9.11.0",
"graphql": "^15.6.0",
"graphql-tag": "^2.12.6",
"inflection": "^3.0.0",
"json-graphql-server": "~3.0.1",
"query-string": "^7.1.3",
"ra-data-fakerest": "^5.0.0-alpha.0",
"ra-data-graphql": "^5.0.0-alpha.0",
"ra-data-graphql-simple": "^5.0.0-alpha.0",
"ra-data-simple-rest": "^5.0.0-alpha.0",
Expand Down
21 changes: 1 addition & 20 deletions examples/demo/src/dataProvider/rest.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,3 @@
import simpleRestProvider from 'ra-data-simple-rest';

const restProvider = simpleRestProvider('http://localhost:4000');

const delayedDataProvider = new Proxy(restProvider, {
get: (target, name, self) => {
// as we await for the dataProvider, JS calls then on it. We must trap that call or else the dataProvider will be called with the then method
if (name === 'then') {
return self;
}
return (resource: string, params: any) =>
new Promise(resolve =>
setTimeout(
() =>
resolve(restProvider[name as string](resource, params)),
500
)
);
},
});

export default delayedDataProvider;
export default simpleRestProvider('http://localhost:4000');
15 changes: 9 additions & 6 deletions examples/demo/src/fakeServer/rest.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import FakeRest from 'fakerest';
import { FetchMockAdapter, withDelay } from 'fakerest';
import fetchMock from 'fetch-mock';
import generateData from 'data-generator-retail';

export default () => {
const data = generateData();
const restServer = new FakeRest.FetchServer('http://localhost:4000');
const adapter = new FetchMockAdapter({
baseUrl: 'http://localhost:4000',
data,
loggingEnabled: true,
middlewares: [withDelay(500)],
});
if (window) {
window.restServer = restServer; // give way to update data in the console
window.restServer = adapter.server; // give way to update data in the console
}
restServer.init(data);
restServer.toggleLogging(); // logging is off by default, enable it
fetchMock.mock('begin:http://localhost:4000', restServer.getHandler());
fetchMock.mock('begin:http://localhost:4000', adapter.getHandler());
return () => fetchMock.restore();
};
1 change: 0 additions & 1 deletion examples/demo/src/fakerest.d.ts

This file was deleted.

9 changes: 9 additions & 0 deletions packages/ra-data-fakerest/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,15 @@ const App = () => (
);
```

## Inspecting the Data

`ra-data-fakerest` makes its internal database accessible in the global scope under the `_database` key. You can use it to inspect the data in your browser console.

```js
_database.getOne('posts', 1);
// { id: 1, title: 'FooBar' }
```

## Features

This data provider uses [FakeRest](https://github.com/marmelab/FakeRest) under the hood. That means that it offers the same features:
Expand Down
2 changes: 1 addition & 1 deletion packages/ra-data-fakerest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"watch": "tsc --outDir dist/esm --module es2015 --watch"
},
"dependencies": {
"fakerest": "^3.0.0"
"fakerest": "^4.0.0-beta.0"
},
"devDependencies": {
"@types/jest": "^29.5.2",
Expand Down
50 changes: 27 additions & 23 deletions packages/ra-data-fakerest/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import FakeRest from 'fakerest';
import { Database } from 'fakerest';
import { DataProvider } from 'ra-core';

/* eslint-disable no-console */
Expand Down Expand Up @@ -34,11 +34,10 @@ function log(type, resource, params, response) {
* })
*/
export default (data, loggingEnabled = false): DataProvider => {
const restServer = new FakeRest.Server();
restServer.init(data);
const database = new Database({ data });
if (typeof window !== 'undefined') {
// give way to update data in the console
(window as any).restServer = restServer;
(window as any)._database = database;
}

function getResponse(type, resource, params) {
Expand All @@ -47,64 +46,69 @@ export default (data, loggingEnabled = false): DataProvider => {
const { page, perPage } = params.pagination;
const { field, order } = params.sort;
const query = {
sort: [field, order],
range: [(page - 1) * perPage, page * perPage - 1],
sort: [field, order] as [string, 'asc' | 'desc'],
range: [(page - 1) * perPage, page * perPage - 1] as [
number,
number,
],
filter: params.filter,
};
return {
data: restServer.getAll(resource, query),
total: restServer.getCount(resource, {
data: database.getAll(resource, query),
total: database.getCount(resource, {
filter: params.filter,
}),
};
}
case 'getOne':
return {
data: restServer.getOne(resource, params.id, { ...params }),
data: database.getOne(resource, params.id, { ...params }),
};
case 'getMany':
return {
data: params.ids.map(
id => restServer.getOne(resource, id),
{ ...params }
),
data: params.ids.map(id => database.getOne(resource, id), {
...params,
}),
};
case 'getManyReference': {
const { page, perPage } = params.pagination;
const { field, order } = params.sort;
const query = {
sort: [field, order],
range: [(page - 1) * perPage, page * perPage - 1],
sort: [field, order] as [string, 'asc' | 'desc'],
range: [(page - 1) * perPage, page * perPage - 1] as [
number,
number,
],
filter: { ...params.filter, [params.target]: params.id },
};
return {
data: restServer.getAll(resource, query),
total: restServer.getCount(resource, {
data: database.getAll(resource, query),
total: database.getCount(resource, {
filter: query.filter,
}),
};
}
case 'update':
return {
data: restServer.updateOne(resource, params.id, {
data: database.updateOne(resource, params.id, {
...params.data,
}),
};
case 'updateMany':
params.ids.forEach(id =>
restServer.updateOne(resource, id, {
database.updateOne(resource, id, {
...params.data,
})
);
return { data: params.ids };
case 'create':
return {
data: restServer.addOne(resource, { ...params.data }),
data: database.addOne(resource, { ...params.data }),
};
case 'delete':
return { data: restServer.removeOne(resource, params.id) };
return { data: database.removeOne(resource, params.id) };
case 'deleteMany':
params.ids.forEach(id => restServer.removeOne(resource, id));
params.ids.forEach(id => database.removeOne(resource, id));
return { data: params.ids };
default:
return false;
Expand All @@ -118,7 +122,7 @@ export default (data, loggingEnabled = false): DataProvider => {
* @returns {Promise} The response
*/
const handle = (type, resource, params): Promise<any> => {
const collection = restServer.getCollection(resource);
const collection = database.getCollection(resource);
if (!collection && type !== 'create') {
const error = new UndefinedResourceError(
`Undefined collection "${resource}"`
Expand Down
4 changes: 4 additions & 0 deletions test-setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ jest.spyOn(console, 'error').mockImplementation((...args) => {
* Mock fetch objects Response, Request and Headers
*/
const { Response, Headers, Request } = require('whatwg-fetch');
// TextEncoder isn't bundled with JsDom, see https://stackoverflow.com/a/68468204/1333479
const { TextEncoder, TextDecoder } = require('util');
fzaninotto marked this conversation as resolved.
Show resolved Hide resolved

global.Response = Response;
global.Headers = Headers;
global.Request = Request;
global.TextEncoder = TextEncoder;
global.TextDecoder = TextDecoder;
38 changes: 6 additions & 32 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -7935,16 +7935,6 @@ __metadata:
languageName: node
linkType: hard

"babel-runtime@npm:^6.26.0":
version: 6.26.0
resolution: "babel-runtime@npm:6.26.0"
dependencies:
core-js: "npm:^2.4.0"
regenerator-runtime: "npm:^0.11.0"
checksum: caa752004936b1463765ed3199c52f6a55d0613b9bed108743d6f13ca532b821d4ea9decc4be1b583193164462b1e3e7eefdfa36b15c72e7daac58dd72c1772f
languageName: node
linkType: hard

"balanced-match@npm:^1.0.0":
version: 1.0.2
resolution: "balanced-match@npm:1.0.2"
Expand Down Expand Up @@ -9167,13 +9157,6 @@ __metadata:
languageName: node
linkType: hard

"core-js@npm:^2.4.0":
version: 2.6.12
resolution: "core-js@npm:2.6.12"
checksum: 00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63
languageName: node
linkType: hard

"core-js@npm:^3.0.0":
version: 3.20.3
resolution: "core-js@npm:3.20.3"
Expand Down Expand Up @@ -9933,14 +9916,13 @@ __metadata:
clsx: "npm:^2.1.1"
data-generator-retail: "npm:^5.0.0-alpha.0"
date-fns: "npm:^3.6.0"
fakerest: "npm:^3.0.0"
fakerest: "npm:^4.0.0-beta.0"
fetch-mock: "npm:~9.11.0"
graphql: "npm:^15.6.0"
graphql-tag: "npm:^2.12.6"
inflection: "npm:^3.0.0"
json-graphql-server: "npm:~3.0.1"
query-string: "npm:^7.1.3"
ra-data-fakerest: "npm:^5.0.0-alpha.0"
ra-data-graphql: "npm:^5.0.0-alpha.0"
ra-data-graphql-simple: "npm:^5.0.0-alpha.0"
ra-data-simple-rest: "npm:^5.0.0-alpha.0"
Expand Down Expand Up @@ -11413,13 +11395,12 @@ __metadata:
languageName: node
linkType: hard

"fakerest@npm:^3.0.0":
version: 3.3.0
resolution: "fakerest@npm:3.3.0"
"fakerest@npm:^4.0.0-beta.0":
version: 4.0.0-beta.0
resolution: "fakerest@npm:4.0.0-beta.0"
dependencies:
babel-runtime: "npm:^6.26.0"
lodash: "npm:^4.17.21"
checksum: ae7adb0c159bd501a3b439c40b6e00f78bae658a40f4eae2b7d3ac2aa6e033534fb6c451d01705b1de316e28f947a88c89fb2f348c789fadebc2876e54105635
checksum: c09ce6b59ac45e9eb3ca32b78e457aa5dae5d46c16fe2d78e12b823eff353791a58b956630d26d494ed8f50927fea2f9225ee35c974ef9125bf4c648f77d6649
languageName: node
linkType: hard

Expand Down Expand Up @@ -17970,7 +17951,7 @@ __metadata:
"@types/jest": "npm:^29.5.2"
cross-env: "npm:^5.2.0"
expect: "npm:^27.4.6"
fakerest: "npm:^3.0.0"
fakerest: "npm:^4.0.0-beta.0"
ra-core: "npm:^5.0.0-beta.3"
rimraf: "npm:^3.0.2"
typescript: "npm:^5.1.3"
Expand Down Expand Up @@ -19092,13 +19073,6 @@ __metadata:
languageName: node
linkType: hard

"regenerator-runtime@npm:^0.11.0":
version: 0.11.1
resolution: "regenerator-runtime@npm:0.11.1"
checksum: 69cfa839efcf2d627fe358bf302ab8b24e5f182cb69f13e66f0612d3640d7838aad1e55662135e3ef2c1cc4322315b757626094fab13a48f9a64ab4bdeb8795b
languageName: node
linkType: hard

"regenerator-runtime@npm:^0.13.4":
version: 0.13.9
resolution: "regenerator-runtime@npm:0.13.9"
Expand Down
Loading