ra-data-graphql
Version:
A GraphQL data provider for react-admin
155 lines • 7.59 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultOptions = exports.ALL_TYPES = exports.MUTATION_TYPES = exports.QUERY_TYPES = void 0;
const merge_js_1 = __importDefault(require("lodash/merge.js"));
const get_js_1 = __importDefault(require("lodash/get.js"));
const pluralize_1 = __importDefault(require("pluralize"));
const ra_core_1 = require("ra-core");
const buildApolloClient_1 = __importDefault(require("./buildApolloClient.cjs"));
const constants_1 = require("./constants.cjs");
const introspection_1 = require("./introspection.cjs");
__exportStar(require("./introspection.cjs"), exports);
exports.QUERY_TYPES = constants_1.QUERY_TYPES;
exports.MUTATION_TYPES = constants_1.MUTATION_TYPES;
exports.ALL_TYPES = constants_1.ALL_TYPES;
/**
* Map dataProvider method names to GraphQL queries and mutations
*
* @example for the Customer resource:
* dataProvider.getList() // query allCustomers() { ... }
* dataProvider.getOne() // query Customer($id: id) { ... }
* dataProvider.getMany() // query allCustomers($filter: { ids: [ids] }) { ... }
* dataProvider.getManyReference() // query allCustomers($filter: { [target]: [id] }) { ... }
* dataProvider.create() // mutation createCustomer($firstName: firstName, $lastName: lastName, ...) { ... }
* dataProvider.update() // mutation updateCustomer($id: id, firstName: firstName, $lastName: lastName, ...) { ... }
* dataProvider.delete() // mutation deleteCustomer($id: id) { ... }
* // note that updateMany and deleteMany aren't mapped in this adapter
*/
exports.defaultOptions = {
resolveIntrospection: introspection_1.introspectSchema,
introspection: {
operationNames: {
[ra_core_1.GET_LIST]: resource => `all${(0, pluralize_1.default)(resource.name)}`,
[ra_core_1.GET_ONE]: resource => `${resource.name}`,
[ra_core_1.GET_MANY]: resource => `all${(0, pluralize_1.default)(resource.name)}`,
[ra_core_1.GET_MANY_REFERENCE]: resource => `all${(0, pluralize_1.default)(resource.name)}`,
[ra_core_1.CREATE]: resource => `create${resource.name}`,
[ra_core_1.UPDATE]: resource => `update${resource.name}`,
[ra_core_1.DELETE]: resource => `delete${resource.name}`,
},
exclude: undefined,
include: undefined,
},
};
const getOptions = (options, raFetchMethod, resource) => {
if (typeof options === 'function') {
return options(resource, raFetchMethod);
}
return options;
};
const buildGraphQLProvider = (options) => {
const { client: clientObject, clientOptions, introspection, resolveIntrospection, buildQuery: buildQueryFactory, override = {}, ...otherOptions } = (0, merge_js_1.default)({}, exports.defaultOptions, options);
if (Object.keys(override).length > 0 &&
process.env.NODE_ENV === 'production') {
console.warn('The override option is deprecated. You should instead wrap the buildQuery function provided by the dataProvider you use.');
}
const client = clientObject || (0, buildApolloClient_1.default)(clientOptions);
let introspectionResults;
let introspectionResultsPromise;
const callApollo = async (raFetchMethod, resource, params) => {
if (introspection) {
if (!introspectionResultsPromise) {
introspectionResultsPromise = resolveIntrospection(client, introspection);
}
introspectionResults = await introspectionResultsPromise;
}
const buildQuery = buildQueryFactory(introspectionResults);
const overriddenBuildQuery = (0, get_js_1.default)(override, `${resource}.${raFetchMethod}`);
const { parseResponse, ...query } = overriddenBuildQuery
? {
...buildQuery(raFetchMethod, resource, params),
...overriddenBuildQuery(params),
}
: buildQuery(raFetchMethod, resource, params);
const operation = getQueryOperation(query.query);
if (operation === 'query') {
const apolloQuery = {
...query,
fetchPolicy: 'network-only',
...getOptions(otherOptions.query, raFetchMethod, resource),
};
apolloQuery.context = (0, merge_js_1.default)({
fetchOptions: {
signal: params?.signal,
},
}, apolloQuery.context);
return (client
// @ts-ignore
.query(apolloQuery)
.then(response => parseResponse(response))
.catch(handleError));
}
const apolloQuery = {
mutation: query.query,
variables: query.variables,
...getOptions(otherOptions.mutation, raFetchMethod, resource),
};
return (client
// @ts-ignore
.mutate(apolloQuery)
.then(parseResponse)
.catch(handleError));
};
const raDataProvider = {
create: (resource, params) => callApollo(ra_core_1.CREATE, resource, params),
delete: (resource, params) => callApollo(ra_core_1.DELETE, resource, params),
deleteMany: (resource, params) => callApollo(ra_core_1.DELETE_MANY, resource, params),
getList: (resource, params) => callApollo(ra_core_1.GET_LIST, resource, params),
getMany: (resource, params) => callApollo(ra_core_1.GET_MANY, resource, params),
getManyReference: (resource, params) => callApollo(ra_core_1.GET_MANY_REFERENCE, resource, params),
getOne: (resource, params) => callApollo(ra_core_1.GET_ONE, resource, params),
update: (resource, params) => callApollo(ra_core_1.UPDATE, resource, params),
updateMany: (resource, params) => callApollo(ra_core_1.UPDATE_MANY, resource, params),
getIntrospection: () => {
if (introspection) {
if (!introspectionResultsPromise) {
introspectionResultsPromise = resolveIntrospection(client, introspection);
}
return introspectionResultsPromise;
}
},
client,
};
return raDataProvider;
};
const handleError = (error) => {
if (error?.networkError) {
throw new ra_core_1.HttpError(error?.networkError?.message, error?.networkError?.statusCode);
}
throw new ra_core_1.HttpError(error.message, 200, error);
};
const getQueryOperation = query => {
if (query && query.definitions && query.definitions.length > 0) {
return query.definitions[0].operation;
}
throw new Error('Unable to determine the query operation');
};
exports.default = buildGraphQLProvider;
//# sourceMappingURL=index.js.map