Skip to content

Forbid inlining smart tag #2590

Open
Open
@benjie

Description

@benjie
import { makeWrapPlansPlugin } from "postgraphile/utils";

const ForbidInliningSmartTagPlugin = makeWrapPlansPlugin(
  (context, build) => {
    if (
      !context.scope.isPgFieldConnection &&
      !context.scope.isPgFieldSimpleCollection &&
      !context.scope.isPgManyRelationConnectionField &&
      !context.scope.isPgManyRelationListField &&
      !context.scope.isPgSingleRelationField &&
      !context.scope.isPgRowByUniqueConstraintField
    ) {
      return null;
    }
    if (context.scope.pgCodec?.extensions?.tags?.forbidInlining) {
      const {
        grafast: { __ListTransformStep },
        dataplanPg: { PgSelectSingleStep, PgSelectStep },
        EXPORTABLE,
      } = build;
      return EXPORTABLE(
        (__ListTransformStep, PgSelectSingleStep, PgSelectStep) =>
          function forbidInlining<T extends Step>(step: T): T {
            let s: Step = step;
            if (s instanceof __ListTransformStep) s = s.getListStep();
            if (s instanceof PgSelectSingleStep) s = s.getClassStep();
            if (s instanceof PgSelectStep) s.setInliningForbidden();
            return step;
          },
        [__ListTransformStep, PgSelectSingleStep, PgSelectStep]
      );
    }
    return null;
  },
  (forbidInlining) => (plan) => forbidInlining(plan())
);

To use it just add it to your plugins: [...] list in your config, and then apply the @forbidInlining smart tag to your table/view:

COMMENT ON VIEW app_public.objects IS $$
@forbidInlining
$$;

Ref #2564

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    🌳 Triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions