import type { GraphqlChange } from '#lib/graphql-change/index' import { Code } from '@radix-ui/themes' import type React from 'react' import { ChangeBase } from '../ChangeBase.js' export const DirectiveUsage: React.FC<{ change: GraphqlChange.Group.DirectiveUsage }> = ({ change }) => { const isAdded = change.type.includes(`_ADDED`) const action = isAdded ? `Added` : `Removed` const preposition = isAdded ? `to` : `from` // Helper to get the directive name based on whether it's added or removed const getDirectiveName = () => { if (`addedDirectiveName` in change.meta) { return change.meta.addedDirectiveName } if (`removedDirectiveName` in change.meta) { return change.meta.removedDirectiveName } return `` } const directiveName = getDirectiveName() switch (change.type) { case `DIRECTIVE_USAGE_UNION_MEMBER_ADDED`: return ( {action} directive @{directiveName} {preposition} union member{' '} {change.meta.addedUnionMemberTypeName} on union {change.meta.unionName} ) case `DIRECTIVE_USAGE_UNION_MEMBER_REMOVED`: return ( {action} directive @{directiveName} {preposition} union member{' '} {change.meta.removedUnionMemberTypeName} on union {change.meta.unionName} ) case `DIRECTIVE_USAGE_ENUM_ADDED`: case `DIRECTIVE_USAGE_ENUM_REMOVED`: return ( {action} directive @{directiveName} {preposition} enum {change.meta.enumName} ) case `DIRECTIVE_USAGE_ENUM_VALUE_ADDED`: case `DIRECTIVE_USAGE_ENUM_VALUE_REMOVED`: return ( {action} directive @{directiveName} {preposition} enum value{' '} {change.meta.enumValueName} on {change.meta.enumName} ) case `DIRECTIVE_USAGE_INPUT_OBJECT_ADDED`: case `DIRECTIVE_USAGE_INPUT_OBJECT_REMOVED`: return ( {action} directive @{directiveName} {preposition} input object{' '} {change.meta.inputObjectName} ) case `DIRECTIVE_USAGE_FIELD_ADDED`: case `DIRECTIVE_USAGE_FIELD_REMOVED`: return ( {action} directive @{directiveName} {preposition} field {change.meta.fieldName} on {' '} {change.meta.typeName} ) case `DIRECTIVE_USAGE_SCALAR_ADDED`: case `DIRECTIVE_USAGE_SCALAR_REMOVED`: return ( {action} directive @{directiveName} {preposition} scalar {change.meta.scalarName} ) case `DIRECTIVE_USAGE_OBJECT_ADDED`: case `DIRECTIVE_USAGE_OBJECT_REMOVED`: return ( {action} directive @{directiveName} {preposition} object {change.meta.objectName} ) case `DIRECTIVE_USAGE_INTERFACE_ADDED`: case `DIRECTIVE_USAGE_INTERFACE_REMOVED`: return ( {action} directive @{directiveName} {preposition} interface{' '} {change.meta.interfaceName} ) case `DIRECTIVE_USAGE_ARGUMENT_DEFINITION_ADDED`: case `DIRECTIVE_USAGE_ARGUMENT_DEFINITION_REMOVED`: return ( {action} directive @{directiveName} {preposition} argument{' '} {change.meta.argumentName} on {change.meta.fieldName} field on{' '} {change.meta.typeName} ) case `DIRECTIVE_USAGE_SCHEMA_ADDED`: case `DIRECTIVE_USAGE_SCHEMA_REMOVED`: return ( {action} directive @{directiveName} {preposition} schema ) case `DIRECTIVE_USAGE_FIELD_DEFINITION_ADDED`: case `DIRECTIVE_USAGE_FIELD_DEFINITION_REMOVED`: return ( {action} directive @{directiveName} {preposition} field definition{' '} {change.meta.fieldName} on {change.meta.typeName} ) case `DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_ADDED`: case `DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_REMOVED`: return ( {action} directive @{directiveName} {preposition} input field{' '} {change.meta.inputFieldName} on {change.meta.inputObjectName} ) } }