@omnigraph/odata
Version:
48 lines (47 loc) • 2.34 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBoundFunctionResolver = createBoundFunctionResolver;
const tslib_1 = require("tslib");
const graphql_parse_resolve_info_1 = require("graphql-parse-resolve-info");
const url_join_1 = tslib_1.__importDefault(require("url-join"));
const utils_1 = require("@graphql-tools/utils");
const fetch_1 = require("@whatwg-node/fetch");
const getUrlString_js_1 = require("../utils/getUrlString.js");
const handleResponseText_js_1 = require("../utils/handleResponseText.js");
const prepareSearchParams_js_1 = require("../utils/prepareSearchParams.js");
function createBoundFunctionResolver({ functionRef, expandNavProps, dataloaderFactory, headersFactory, }) {
return function boundFunctionResolver(root, args, context, info) {
const url = new URL(root['@odata.id']);
url.href = (0, url_join_1.default)(url.href, '/' + functionRef);
const argsEntries = Object.entries(args);
if (argsEntries.length) {
url.href += `(${argsEntries
.filter(argEntry => argEntry[0] !== 'queryOptions')
.map(([argName, value]) => [argName, typeof value === 'string' ? `'${value}'` : value])
.map(argEntry => argEntry.join('='))
.join(',')})`;
}
const parsedInfoFragment = (0, graphql_parse_resolve_info_1.parseResolveInfo)(info);
const searchParams = (0, prepareSearchParams_js_1.prepareSearchParams)({
fragment: parsedInfoFragment,
schema: info.schema,
expandNavProps,
});
searchParams?.forEach((value, key) => {
url.searchParams.set(key, value);
});
const urlString = (0, getUrlString_js_1.getUrlString)(url);
const method = 'GET';
const request = new fetch_1.Request(urlString, {
method,
headers: headersFactory({
root,
args,
context,
info,
env: process.env,
}, method),
});
return (0, utils_1.mapMaybePromise)(dataloaderFactory(context).load(request), response => (0, utils_1.mapMaybePromise)(response.text(), responseText => (0, handleResponseText_js_1.handleResponseText)(responseText, urlString, info)));
};
}
;