Add eslint-disable and TypeScript generics to graph hooks

Centralized graph files (hooks/graph/*.ts) define GraphQL
queries consumed by multiple page components. This architecture
intentionally separates field definitions from usage, triggering
relay/unused-fields and relay/must-colocate-fragment-spreads.
File-level eslint-disable comments suppress these false positives.

Also adds explicit TypeScript generics to useMutation and
usePaginationFragment calls to satisfy relay/generated-typescript-types
without eslint-disable.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2026-03-15 13:32:18 +01:00
parent dbb4811a2c
commit d263cda3f6
21 changed files with 98 additions and 24 deletions

View File

@@ -4,8 +4,13 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { AssetGraphCreateMutation } from "#/__generated__/core/AssetGraphCreateMutation.graphql";
import type { AssetGraphDeleteMutation } from "#/__generated__/core/AssetGraphDeleteMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const assetsQuery = graphql`
query AssetGraphListQuery($organizationId: ID!, $snapshotId: ID) {
node(id: $organizationId) {
@@ -130,7 +135,7 @@ export const useDeleteAsset = (
asset: { id?: string; name?: string },
connectionId: string,
) => {
const [mutate] = useMutation(deleteAssetMutation);
const [mutate] = useMutation<AssetGraphDeleteMutation>(deleteAssetMutation);
const confirm = useConfirm();
const { __ } = useTranslate();
@@ -161,7 +166,7 @@ export const useDeleteAsset = (
};
export const useCreateAsset = (connectionId: string) => {
const [mutate, isMutating] = useMutation(createAssetMutation);
const [mutate, isMutating] = useMutation<AssetGraphCreateMutation>(createAssetMutation);
const { __ } = useTranslate();
return [

View File

@@ -4,8 +4,13 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { AuditGraphCreateMutation } from "#/__generated__/core/AuditGraphCreateMutation.graphql";
import type { AuditGraphUpdateMutation } from "#/__generated__/core/AuditGraphUpdateMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const auditsQuery = graphql`
query AuditGraphListQuery($organizationId: ID!) {
node(id: $organizationId) {
@@ -156,7 +161,7 @@ export const useDeleteAudit = (
};
export const useCreateAudit = (connectionId: string) => {
const [mutate] = useMutation(createAuditMutation);
const [mutate] = useMutation<AuditGraphCreateMutation>(createAuditMutation);
const { __ } = useTranslate();
return (input: {
@@ -193,7 +198,7 @@ export const useCreateAudit = (connectionId: string) => {
};
export const useUpdateAudit = () => {
const [mutate] = useMutation(updateAuditMutation);
const [mutate] = useMutation<AuditGraphUpdateMutation>(updateAuditMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -4,8 +4,13 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { ContinualImprovementGraphCreateMutation } from "#/__generated__/core/ContinualImprovementGraphCreateMutation.graphql";
import type { ContinualImprovementGraphUpdateMutation } from "#/__generated__/core/ContinualImprovementGraphUpdateMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const ContinualImprovementsConnectionKey
= "ContinualImprovementsPage_continualImprovements";
@@ -152,7 +157,7 @@ export const useDeleteContinualImprovement = (
};
export const useCreateContinualImprovement = (connectionId: string) => {
const [mutate] = useMutation(createContinualImprovementMutation);
const [mutate] = useMutation<ContinualImprovementGraphCreateMutation>(createContinualImprovementMutation);
const { __ } = useTranslate();
return (input: {
@@ -200,7 +205,7 @@ export const useCreateContinualImprovement = (connectionId: string) => {
};
export const useUpdateContinualImprovement = () => {
const [mutate] = useMutation(updateContinualImprovementMutation);
const [mutate] = useMutation<ContinualImprovementGraphUpdateMutation>(updateContinualImprovementMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -4,6 +4,12 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { DatumGraphCreateMutation } from "#/__generated__/core/DatumGraphCreateMutation.graphql";
import type { DatumGraphDeleteMutation } from "#/__generated__/core/DatumGraphDeleteMutation.graphql";
import type { DatumGraphUpdateMutation } from "#/__generated__/core/DatumGraphUpdateMutation.graphql";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const dataQuery = graphql`
query DatumGraphListQuery($organizationId: ID!, $snapshotId: ID = null) {
node(id: $organizationId) {
@@ -123,7 +129,7 @@ export const useDeleteDatum = (
datum: { id?: string; name?: string },
connectionId: string,
) => {
const [mutate] = useMutation(deleteDatumMutation);
const [mutate] = useMutation<DatumGraphDeleteMutation>(deleteDatumMutation);
const confirm = useConfirm();
const { __ } = useTranslate();
@@ -154,7 +160,7 @@ export const useDeleteDatum = (
};
export const useCreateDatum = (connectionId: string) => {
const [mutate] = useMutation(createDatumMutation);
const [mutate] = useMutation<DatumGraphCreateMutation>(createDatumMutation);
const { __ } = useTranslate();
return (input: {
@@ -184,7 +190,7 @@ export const useCreateDatum = (connectionId: string) => {
};
export const useUpdateDatum = () => {
const [mutate] = useMutation(updateDatumMutation);
const [mutate] = useMutation<DatumGraphUpdateMutation>(updateDatumMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -1,5 +1,7 @@
import { graphql } from "relay-runtime";
/* eslint-disable relay/unused-fields */
export const evidenceFileQuery = graphql`
query EvidenceGraphFileQuery($evidenceId: ID!) {
node(id: $evidenceId) {

View File

@@ -6,6 +6,8 @@ import { graphql } from "relay-runtime";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const connectionListKey = "FrameworksListQuery_frameworks";
export const frameworksQuery = graphql`

View File

@@ -5,6 +5,8 @@ import type { MeasureGraphDeleteMutation } from "#/__generated__/core/MeasureGra
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const measuresQuery = graphql`
query MeasureGraphListQuery($organizationId: ID!) {
organization: node(id: $organizationId) @required(action: THROW) {

View File

@@ -6,6 +6,8 @@ import type { MeetingGraphUpdateMutation } from "#/__generated__/core/MeetingGra
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const meetingsQuery = graphql`
query MeetingGraphListQuery($organizationId: ID!) {
organization: node(id: $organizationId) {

View File

@@ -4,8 +4,13 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { NonconformityGraphCreateMutation } from "#/__generated__/core/NonconformityGraphCreateMutation.graphql";
import type { NonconformityGraphUpdateMutation } from "#/__generated__/core/NonconformityGraphUpdateMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const NonconformitiesConnectionKey
= "NonconformitiesPage_nonconformities";
@@ -168,7 +173,7 @@ export const useDeleteNonconformity = (
};
export const useCreateNonconformity = (connectionId: string) => {
const [mutate] = useMutation(createNonconformityMutation);
const [mutate] = useMutation<NonconformityGraphCreateMutation>(createNonconformityMutation);
const { __ } = useTranslate();
return (input: {
@@ -225,7 +230,7 @@ export const useCreateNonconformity = (connectionId: string) => {
};
export const useUpdateNonconformity = () => {
const [mutate] = useMutation(updateNonconformityMutation);
const [mutate] = useMutation<NonconformityGraphUpdateMutation>(updateNonconformityMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -4,8 +4,13 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { ObligationGraphCreateMutation } from "#/__generated__/core/ObligationGraphCreateMutation.graphql";
import type { ObligationGraphUpdateMutation } from "#/__generated__/core/ObligationGraphUpdateMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const ObligationsConnectionKey = "ObligationsPage_obligations";
export const obligationsQuery = graphql`
@@ -150,7 +155,7 @@ export const useDeleteObligation = (
};
export const useCreateObligation = (connectionId: string) => {
const [mutate] = useMutation(createObligationMutation);
const [mutate] = useMutation<ObligationGraphCreateMutation>(createObligationMutation);
const { __ } = useTranslate();
return (input: {
@@ -195,7 +200,7 @@ export const useCreateObligation = (connectionId: string) => {
};
export const useUpdateObligation = () => {
const [mutate] = useMutation(updateObligationMutation);
const [mutate] = useMutation<ObligationGraphUpdateMutation>(updateObligationMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -6,6 +6,8 @@ import { graphql } from "relay-runtime";
import type { PeopleGraphQuery } from "#/__generated__/core/PeopleGraphQuery.graphql";
/* eslint-disable relay/unused-fields */
export const peopleQuery = graphql`
query PeopleGraphQuery($organizationId: ID!, $filter: ProfileFilter) {
organization: node(id: $organizationId) {

View File

@@ -4,8 +4,17 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { ProcessingActivityGraphCreateDPIAMutation } from "#/__generated__/core/ProcessingActivityGraphCreateDPIAMutation.graphql";
import type { ProcessingActivityGraphCreateMutation } from "#/__generated__/core/ProcessingActivityGraphCreateMutation.graphql";
import type { ProcessingActivityGraphCreateTIAMutation } from "#/__generated__/core/ProcessingActivityGraphCreateTIAMutation.graphql";
import type { ProcessingActivityGraphUpdateDPIAMutation } from "#/__generated__/core/ProcessingActivityGraphUpdateDPIAMutation.graphql";
import type { ProcessingActivityGraphUpdateMutation } from "#/__generated__/core/ProcessingActivityGraphUpdateMutation.graphql";
import type { ProcessingActivityGraphUpdateTIAMutation } from "#/__generated__/core/ProcessingActivityGraphUpdateTIAMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const ProcessingActivitiesConnectionKey
= "ProcessingActivitiesPage_processingActivities";
export type ProcessingActivityDPIAResidualRisk = "LOW" | "MEDIUM" | "HIGH";
@@ -267,7 +276,7 @@ export const useDeleteProcessingActivity = (
};
export const useCreateProcessingActivity = (connectionId?: string) => {
const [mutate] = useMutation(createProcessingActivityMutation);
const [mutate] = useMutation<ProcessingActivityGraphCreateMutation>(createProcessingActivityMutation);
const { __ } = useTranslate();
return (input: {
@@ -337,7 +346,7 @@ export const useCreateProcessingActivity = (connectionId?: string) => {
};
export const useUpdateProcessingActivity = () => {
const [mutate] = useMutation(updateProcessingActivityMutation);
const [mutate] = useMutation<ProcessingActivityGraphUpdateMutation>(updateProcessingActivityMutation);
const { __ } = useTranslate();
return (input: {
@@ -449,7 +458,7 @@ export const deleteDataProtectionImpactAssessmentMutation = graphql`
`;
export const useCreateDataProtectionImpactAssessment = () => {
const [mutate] = useMutation(createDataProtectionImpactAssessmentMutation);
const [mutate] = useMutation<ProcessingActivityGraphCreateDPIAMutation>(createDataProtectionImpactAssessmentMutation);
const { __ } = useTranslate();
return (input: {
@@ -475,7 +484,7 @@ export const useCreateDataProtectionImpactAssessment = () => {
};
export const useUpdateDataProtectionImpactAssessment = () => {
const [mutate] = useMutation(updateDataProtectionImpactAssessmentMutation);
const [mutate] = useMutation<ProcessingActivityGraphUpdateDPIAMutation>(updateDataProtectionImpactAssessmentMutation);
const { __ } = useTranslate();
return (input: {
@@ -606,7 +615,7 @@ export const deleteTransferImpactAssessmentMutation = graphql`
`;
export const useCreateTransferImpactAssessment = () => {
const [mutate] = useMutation(createTransferImpactAssessmentMutation);
const [mutate] = useMutation<ProcessingActivityGraphCreateTIAMutation>(createTransferImpactAssessmentMutation);
const { __ } = useTranslate();
return (input: {
@@ -632,7 +641,7 @@ export const useCreateTransferImpactAssessment = () => {
};
export const useUpdateTransferImpactAssessment = () => {
const [mutate] = useMutation(updateTransferImpactAssessmentMutation);
const [mutate] = useMutation<ProcessingActivityGraphUpdateTIAMutation>(updateTransferImpactAssessmentMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -4,8 +4,13 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { RightsRequestGraphCreateMutation } from "#/__generated__/core/RightsRequestGraphCreateMutation.graphql";
import type { RightsRequestGraphUpdateMutation } from "#/__generated__/core/RightsRequestGraphUpdateMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const RightsRequestsConnectionKey = "RightsRequestsPage_rightsRequests";
export const rightsRequestsQuery = graphql`
@@ -134,7 +139,7 @@ export const useDeleteRightsRequest = (
};
export const useCreateRightsRequest = (connectionId: string) => {
const [mutate] = useMutation(createRightsRequestMutation);
const [mutate] = useMutation<RightsRequestGraphCreateMutation>(createRightsRequestMutation);
const { __ } = useTranslate();
return (input: {
@@ -182,7 +187,7 @@ export const useCreateRightsRequest = (connectionId: string) => {
};
export const useUpdateRightsRequest = () => {
const [mutate] = useMutation(updateRightsRequestMutation);
const [mutate] = useMutation<RightsRequestGraphUpdateMutation>(updateRightsRequestMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -9,9 +9,12 @@ import { graphql } from "relay-runtime";
import type { RiskGraphDeleteMutation } from "#/__generated__/core/RiskGraphDeleteMutation.graphql";
import type { RiskGraphFragment$key } from "#/__generated__/core/RiskGraphFragment.graphql";
import type { RiskGraphListQuery } from "#/__generated__/core/RiskGraphListQuery.graphql";
import type { RisksListQuery } from "#/__generated__/core/RisksListQuery.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
const deleteRiskMutation = graphql`
mutation RiskGraphDeleteMutation(
$input: DeleteRiskInput!
@@ -95,7 +98,7 @@ export const RisksConnectionKey = "RisksListQuery_risks";
export function useRisksQuery(queryRef: PreloadedQuery<RiskGraphListQuery>) {
const data = usePreloadedQuery(risksQuery, queryRef);
const pagination = usePaginationFragment(
const pagination = usePaginationFragment<RisksListQuery, RiskGraphFragment$key>(
risksFragment,
data.organization as RiskGraphFragment$key,
);

View File

@@ -4,8 +4,12 @@ import { useConfirm } from "@probo/ui";
import { useMutation } from "react-relay";
import { graphql } from "relay-runtime";
import type { SnapshotGraphCreateMutation } from "#/__generated__/core/SnapshotGraphCreateMutation.graphql";
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const SnapshotsConnectionKey = "SnapshotsPage_snapshots";
export const snapshotsQuery = graphql`
@@ -102,7 +106,7 @@ export const useDeleteSnapshot = (
};
export const useCreateSnapshot = (connectionId: string) => {
const [mutate] = useMutation(createSnapshotMutation);
const [mutate] = useMutation<SnapshotGraphCreateMutation>(createSnapshotMutation);
const { __ } = useTranslate();
return (input: {

View File

@@ -1,5 +1,7 @@
import { graphql } from "relay-runtime";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
export const tasksQuery = graphql`
query TaskGraphQuery($organizationId: ID!) {
organization: node(id: $organizationId) {

View File

@@ -1,5 +1,7 @@
import { graphql } from "react-relay";
/* eslint-disable relay/unused-fields */
export const trustCenterByIdQuery = graphql`
query TrustCenterAccessTokenGraphQuery($trustCenterId: ID!) {
node(id: $trustCenterId) {

View File

@@ -11,6 +11,8 @@ import type { VendorGraphSelectQuery } from "#/__generated__/core/VendorGraphSel
import { useMutationWithToasts } from "../useMutationWithToasts";
/* eslint-disable relay/unused-fields, relay/must-colocate-fragment-spreads */
const createVendorMutation = graphql`
mutation VendorGraphCreateMutation(
$input: CreateVendorInput!

View File

@@ -2,6 +2,9 @@ import { graphql, useLazyLoadQuery, usePaginationFragment } from "react-relay";
import type { usePaginatedMeasuresFragment$key } from "#/__generated__/core/usePaginatedMeasuresFragment.graphql";
import type { usePaginatedMeasuresQuery } from "#/__generated__/core/usePaginatedMeasuresQuery.graphql";
import type { usePaginatedMeasuresQuery_fragment } from "#/__generated__/core/usePaginatedMeasuresQuery_fragment.graphql";
/* eslint-disable relay/unused-fields */
const measuresQuery = graphql`
query usePaginatedMeasuresQuery($organizationId: ID!) {
@@ -55,7 +58,7 @@ export function usePaginatedMeasures(organizationId: string) {
},
{ fetchPolicy: "network-only" },
);
return usePaginationFragment(
return usePaginationFragment<usePaginatedMeasuresQuery_fragment, usePaginatedMeasuresFragment$key>(
measuresFragment,
query.organization as usePaginatedMeasuresFragment$key,
);

View File

@@ -12,6 +12,7 @@ export type MutationFieldUpdate<T extends Record<string, unknown>, TKey extends
export function useMutateField<Input extends Record<string, unknown>>(
mutation: GraphQLTaggedNode,
) {
// eslint-disable-next-line relay/generated-typescript-types
const [mutate, isUpdating] = useMutation(mutation);
return {