UNPKG

postgraphile-plugin-connection-filter

Version:
123 lines 5.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PgConnectionArgFilterComputedAttributesPlugin = void 0; const utils_1 = require("./utils"); const EXPORTABLE_1 = require("./EXPORTABLE"); const version_1 = require("./version"); const pgConnectionFilterApplyComputedAttribute = (0, EXPORTABLE_1.EXPORTABLE)(() => (PgCondition, computedAttributeResource, fieldName, functionResultCodec, $where, value) => { if (typeof computedAttributeResource.from !== "function") { throw new Error(`Unexpected...`); } // TODO: assertAllowed? if (value == null) return; const expression = computedAttributeResource.from({ placeholder: $where.alias, }); const $col = new PgCondition($where); $col.extensions.pgFilterAttribute = { fieldName, codec: functionResultCodec, expression, }; return $col; }, [], "pgConnectionFilterApplyComputedAttribute"); exports.PgConnectionArgFilterComputedAttributesPlugin = { name: "PgConnectionArgFilterComputedAttributesPlugin", version: version_1.version, schema: { behaviorRegistry: { add: { filterBy: { description: "", entities: ["pgResource"], }, }, }, entityBehavior: { pgResource: { inferred(behavior, entity, build) { if (build.options.connectionFilterComputedColumns && (0, utils_1.isComputedScalarAttributeResource)(entity)) { return [behavior, "filterBy"]; } else { return behavior; } }, }, }, hooks: { GraphQLInputObjectType_fields(inFields, build, context) { let fields = inFields; const { inflection, connectionFilterOperatorsDigest, dataplanPg: { TYPES, PgCondition }, EXPORTABLE, } = build; const { fieldWithHooks, scope: { pgCodec: codec, isPgConnectionFilter }, } = context; if (!isPgConnectionFilter || !codec || !codec.attributes || codec.isAnonymous) { return fields; } // TODO: This may need to change once V5 fixes the need for it const source = Object.values(build.input.pgRegistry.pgResources).find((s) => s.codec === codec && !s.parameters && !s.isUnique); if (!source) { return fields; } const computedAttributeResources = (0, utils_1.getComputedAttributeResources)(build, source); for (const computedAttributeResource of computedAttributeResources) { // Must return a scalar or an array if (!computedAttributeResource.isUnique) { continue; } if (computedAttributeResource.codec.attributes) { continue; } if (computedAttributeResource.codec === TYPES.void) { continue; } const digest = connectionFilterOperatorsDigest(computedAttributeResource.codec); if (!digest) { continue; } const OperatorsType = build.getTypeByName(digest.operatorsTypeName); if (!OperatorsType) { continue; } if (!build.behavior.pgResourceMatches(computedAttributeResource, "filterBy")) { continue; } const { argDetails } = build.pgGetArgDetailsFromParameters(computedAttributeResource, computedAttributeResource.parameters.slice(1)); // Must have only one required argument if (argDetails.some((a) => !a.optional)) { continue; } // Looks good const fieldName = inflection.computedAttributeField({ resource: computedAttributeResource, }); const functionResultCodec = computedAttributeResource.codec; fields = build.extend(fields, { [fieldName]: fieldWithHooks({ fieldName, isPgConnectionFilterField: true, }, { description: `Filter by the object’s \`${fieldName}\` field.`, type: OperatorsType, apply: EXPORTABLE((PgCondition, computedAttributeResource, fieldName, functionResultCodec, pgConnectionFilterApplyComputedAttribute) => function ($where, value) { return pgConnectionFilterApplyComputedAttribute(PgCondition, computedAttributeResource, fieldName, functionResultCodec, $where, value); }, [ PgCondition, computedAttributeResource, fieldName, functionResultCodec, pgConnectionFilterApplyComputedAttribute, ]), }), }, ""); } return fields; }, }, }, }; //# sourceMappingURL=PgConnectionArgFilterComputedAttributesPlugin.js.map