ra-data-graphql-simple
Version:
A GraphQL simple data provider for react-admin
58 lines • 2.73 kB
JavaScript
import merge from 'lodash/merge.js';
import buildDataProvider, { defaultOptions as baseDefaultOptions, } from 'ra-data-graphql';
import { DELETE_MANY, UPDATE_MANY } from 'ra-core';
import pluralize from 'pluralize';
import defaultBuildQuery from "./buildQuery.js";
export const buildQuery = defaultBuildQuery;
export { buildQueryFactory } from "./buildQuery.js";
export { default as buildGqlQuery } from "./buildGqlQuery.js";
export { default as buildVariables } from "./buildVariables.js";
export { default as getResponseParser } from "./getResponseParser.js";
const defaultOptions = {
...baseDefaultOptions,
buildQuery: defaultBuildQuery,
};
const bulkActionOperationNames = {
[DELETE_MANY]: resource => `delete${pluralize(resource.name)}`,
[UPDATE_MANY]: resource => `update${pluralize(resource.name)}`,
};
export default (options) => {
const { bulkActionsEnabled = false, ...dPOptions } = merge({}, defaultOptions, options);
if (bulkActionsEnabled && dPOptions.introspection?.operationNames)
dPOptions.introspection.operationNames = merge(dPOptions.introspection.operationNames, bulkActionOperationNames);
const defaultDataProvider = buildDataProvider(dPOptions);
return {
...defaultDataProvider,
// This provider defaults to sending multiple DELETE requests for DELETE_MANY
// and multiple UPDATE requests for UPDATE_MANY unless bulk actions are enabled
// This can be optimized using the apollo-link-batch-http link
...(bulkActionsEnabled
? {}
: {
deleteMany: (resource, params) => {
const { ids, ...otherParams } = params;
return Promise.all(ids.map(id => defaultDataProvider.delete(resource, {
id,
previousData: null,
...otherParams,
}))).then(results => {
const data = results.reduce((acc, { data }) => [...acc, data.id], []);
return { data };
});
},
updateMany: (resource, params) => {
const { ids, data, ...otherParams } = params;
return Promise.all(ids.map(id => defaultDataProvider.update(resource, {
id,
data: data,
previousData: null,
...otherParams,
}))).then(results => {
const data = results.reduce((acc, { data }) => [...acc, data.id], []);
return { data };
});
},
}),
};
};
//# sourceMappingURL=index.js.map