join-monster
Version:
A GraphQL to SQL query execution layer for batch data fetching.
75 lines (74 loc) • 3.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _assert = _interopRequireDefault(require("assert"));
var queryAST = _interopRequireWildcard(require("./query-ast-to-sql-ast"));
var _arrayToConnection = _interopRequireDefault(require("./array-to-connection"));
var _aliasNamespace = _interopRequireDefault(require("./alias-namespace"));
var _batchPlanner = _interopRequireDefault(require("./batch-planner"));
var _util = require("./util");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
async function joinMonster(resolveInfo, context, dbCall, options = {}) {
const sqlAST = queryAST.queryASTToSqlAST(resolveInfo, options, context);
const {
sql,
shapeDefinition
} = await (0, _util.compileSqlAST)(sqlAST, context, options);
if (!sql) return {};
let data = await (0, _util.handleUserDbCall)(dbCall, sql, sqlAST, shapeDefinition);
data = (0, _arrayToConnection.default)(data, sqlAST);
await (0, _batchPlanner.default)(sqlAST, data, dbCall, context, options);
if (Array.isArray(data)) {
const childrenToCheck = sqlAST.children.filter(child => child.sqlBatch);
return data.filter(d => {
for (const child of childrenToCheck) {
if (d[child.fieldName] == null) {
return false;
}
}
return true;
});
}
return data;
}
async function getNode(typeName, resolveInfo, context, condition, dbCall, options = {}) {
const type = resolveInfo.schema._typeMap[typeName];
(0, _assert.default)(type, `Type "${typeName}" not found in your schema.`);
(0, _assert.default)((0, _util.getConfigFromSchemaObject)(type).sqlTable, `joinMonster can't fetch a ${typeName} as a Node unless it has "sqlTable" tagged.`);
let where = (0, _util.buildWhereFunction)(type, condition, options);
const fakeParentNode = {
_fields: {
node: {
type,
name: type.name.toLowerCase(),
args: [],
extensions: {
joinMonster: {
where
}
}
}
}
};
const namespace = new _aliasNamespace.default(options.minify, options.aliasPrefix);
const sqlAST = {};
const fieldNodes = resolveInfo.fieldNodes || resolveInfo.fieldASTs;
queryAST.populateASTNode.call(resolveInfo, fieldNodes[0], fakeParentNode, sqlAST, namespace, 0, options, context);
queryAST.pruneDuplicateSqlDeps(sqlAST, namespace);
const {
sql,
shapeDefinition
} = await (0, _util.compileSqlAST)(sqlAST, context, options);
const data = (0, _arrayToConnection.default)(await (0, _util.handleUserDbCall)(dbCall, sql, sqlAST, shapeDefinition), sqlAST);
await (0, _batchPlanner.default)(sqlAST, data, dbCall, context, options);
if (!data) return data;
data.__type__ = type.name;
return data;
}
joinMonster.getNode = getNode;
joinMonster.version = require('../package.json').version;
var _default = joinMonster;
exports.default = _default;