UNPKG

ra-data-graphql

Version:

A GraphQL data provider for react-admin

155 lines 7.59 kB
"use strict"; 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