diff --git a/lib/EasyDirectiveVisitor.ts b/lib/EasyDirectiveVisitor.ts index 3b45a99..0724880 100644 --- a/lib/EasyDirectiveVisitor.ts +++ b/lib/EasyDirectiveVisitor.ts @@ -317,22 +317,17 @@ abstract class EasyDirectiveVisitor< public visitArgumentDefinition( argument: GraphQLArgument, { field }: { field: GraphQLField }, - directiveArgs: TArgs, ): void { throw new Error('Method not implemented.'); } - public visitInputObject( - object: GraphQLInputObjectType, - directiveArgs: TArgs, - ): void { + public visitInputObject(object: GraphQLInputObjectType): void { throw new Error('Method not implemented.'); } public visitInputFieldDefinition( field: GraphQLInputField, { objectType }: { objectType: GraphQLInputObjectType }, - directiveArgs: TArgs, ): void { throw new Error('Method not implemented.'); } @@ -340,14 +335,12 @@ abstract class EasyDirectiveVisitor< public visitFieldDefinition( field: GraphQLFieldConfig, { objectType }: { objectType: GraphQLObjectType }, - directiveArgs: TArgs, ): void { throw new Error('Method not implemented.'); } public visitObject( object: GraphQLInterfaceType | GraphQLObjectType, - directiveArgs: TArgs, ): void { throw new Error('Method not implemented.'); } diff --git a/lib/ValidateDirectiveVisitor.test.ts b/lib/ValidateDirectiveVisitor.test.ts index 1b84c08..f6f7620 100644 --- a/lib/ValidateDirectiveVisitor.test.ts +++ b/lib/ValidateDirectiveVisitor.test.ts @@ -124,16 +124,13 @@ type ValidatedInputErrorOutput { describe('Throw policy', (): void => { class TestDirective extends ValidateDirectiveVisitorNonTyped { // eslint-disable-next-line class-methods-use-this - public getValidationForArgs( - _: unknown, - args: TestDirectiveArgs, - ): ValidateFunction { + public getValidationForArgs(): ValidateFunction { const validate = (): void => { throw new ValidationError('Validation error'); }; Object.defineProperty(validate, 'validateProperties', { value: { - args, + args: this.args as TestDirectiveArgs, directive: 'testThrowPolicyValidate', }, writable: false, @@ -271,11 +268,8 @@ type ValidatedInputErrorOutput { }; // eslint-disable-next-line class-methods-use-this - public getValidationForArgs( - _: unknown, - args: TestDirectiveArgs, - ): ValidateFunction | undefined { - return args.validate ? mockValidate : undefined; + public getValidationForArgs(): ValidateFunction | undefined { + return this.args.validate ? mockValidate : undefined; } } @@ -1831,11 +1825,8 @@ ${validationDirectionEnumTypeDefs(capitalizedName)} false; // eslint-disable-next-line class-methods-use-this - public getValidationForArgs( - _: unknown, - args: TestDirectiveArgs, - ): ValidateFunction | undefined { - return args.validate ? mockValidate : undefined; + public getValidationForArgs(): ValidateFunction | undefined { + return this.args.validate ? mockValidate : undefined; } } @@ -1970,12 +1961,8 @@ ${validationDirectionEnumTypeDefs(capitalizedName)} }, }; - // eslint-disable-next-line class-methods-use-this - public getValidationForArgs( - _: unknown, - args: TestDirectiveArgs, - ): ValidateFunction | undefined { - return args.validate ? mockValidate : undefined; + public getValidationForArgs(): ValidateFunction | undefined { + return this.args.validate ? mockValidate : undefined; } } diff --git a/lib/ValidateDirectiveVisitor.ts b/lib/ValidateDirectiveVisitor.ts index a60fc74..b4d4dcb 100644 --- a/lib/ValidateDirectiveVisitor.ts +++ b/lib/ValidateDirectiveVisitor.ts @@ -913,8 +913,6 @@ abstract class ValidateDirectiveVisitor< */ public abstract getValidationForArgs( location: DirectiveLocation, - args: TArgs, - path?: string[], ): ValidateFunction | undefined; // Arguments directly annotated with the directive, such as @@ -926,16 +924,14 @@ abstract class ValidateDirectiveVisitor< public visitArgumentDefinition( argument: GraphQLArgument, { field }: { field: GraphQLField }, - directiveArgs: TArgs, ): void { const validate = this.getValidationForArgs( DirectiveLocation.ARGUMENT_DEFINITION, - directiveArgs, ); if (!validate) { return; } - const { policy } = directiveArgs; + const { policy } = this.args; wrapFieldResolverValidateArgument( field, argument, @@ -963,17 +959,11 @@ abstract class ValidateDirectiveVisitor< // // This is done with `addValidationResolversToSchema()`. - public visitInputObject( - object: GraphQLInputObjectType, - directiveArgs: TArgs, - ): void { - const validate = this.getValidationForArgs( - DirectiveLocation.INPUT_OBJECT, - directiveArgs, - ); + public visitInputObject(object: GraphQLInputObjectType): void { + const validate = this.getValidationForArgs(DirectiveLocation.INPUT_OBJECT); // istanbul ignore if (shouldn't reach, visitInputObject() is called only if there is a directive) if (!validate) return; - const { policy } = directiveArgs; + const { policy } = this.args; Object.values(object.getFields()).forEach(field => { addContainerEntryValidation(object, field, validate, policy); @@ -987,14 +977,12 @@ abstract class ValidateDirectiveVisitor< }: { objectType: GraphQLInputObjectType; }, - directiveArgs: TArgs, ): void { const validate = this.getValidationForArgs( DirectiveLocation.INPUT_FIELD_DEFINITION, - directiveArgs, ); if (!validate) return; - const { policy } = directiveArgs; + const { policy } = this.args; addContainerEntryValidation(objectType, field, validate, policy); } @@ -1011,11 +999,9 @@ abstract class ValidateDirectiveVisitor< }: { objectType: GraphQLObjectType; }, - directiveArgs: TArgs, ): void { const validate = this.getValidationForArgs( DirectiveLocation.FIELD_DEFINITION, - directiveArgs, ); if (!validate) return; if (this.applyValidationToOutputTypesAfterOriginalResolver) { @@ -1033,14 +1019,8 @@ abstract class ValidateDirectiveVisitor< } } - public visitObject( - object: GraphQLObjectType | GraphQLInterfaceType, - directiveArgs: TArgs, - ): void { - const validate = this.getValidationForArgs( - DirectiveLocation.OBJECT, - directiveArgs, - ); + public visitObject(object: GraphQLObjectType | GraphQLInterfaceType): void { + const validate = this.getValidationForArgs(DirectiveLocation.OBJECT); if (!validate) return; Object.values(object.getFields()).forEach(field => { if (this.applyValidationToOutputTypesAfterOriginalResolver) { @@ -1068,17 +1048,15 @@ abstract class ValidateDirectiveVisitor< fields.forEach(field => { const [directive] = getDirective(schema, field, directiveName) ?? []; if (directive) { - this.visitFieldDefinition( - field, - { objectType: query }, - directive as TArgs, - ); + this.args = directive as TArgs; + this.visitFieldDefinition(field, { objectType: query }); } field.args.forEach(arg => { const [directiveOnArg] = getDirective(schema, arg, directiveName) ?? []; if (directiveOnArg) { - this.visitArgumentDefinition(arg, { field }, directiveOnArg as TArgs); + this.args = directiveOnArg as TArgs; + this.visitArgumentDefinition(arg, { field }); } const finalType = getFinalType(arg.type); @@ -1111,7 +1089,8 @@ abstract class ValidateDirectiveVisitor< const [directive] = getDirective(schema, inputObject, directiveName) ?? []; if (directive) { - this.visitInputObject(inputObject, directive as TArgs); + this.args = directive as TArgs; + this.visitInputObject(inputObject); } Object.values(inputObject.getFields()).forEach(inputField => { @@ -1119,11 +1098,8 @@ abstract class ValidateDirectiveVisitor< getDirective(schema, inputField, directiveName) ?? []; if (directiveOnInputField) { - this.visitInputFieldDefinition( - inputField, - { objectType: inputObject }, - directiveOnInputField as TArgs, - ); + this.args = directiveOnInputField as TArgs; + this.visitInputFieldDefinition(inputField, { objectType: inputObject }); } const inputFieldType = getFinalType(inputField.type); diff --git a/lib/createSchemaMapperForVisitor.ts b/lib/createSchemaMapperForVisitor.ts index 9104292..f032d6f 100644 --- a/lib/createSchemaMapperForVisitor.ts +++ b/lib/createSchemaMapperForVisitor.ts @@ -20,7 +20,9 @@ export const createSchemaMapperForVisitor = [MapperKind.OBJECT_TYPE](type, schema) { const [directive] = getDirective(schema, type, directiveName) ?? []; if (!directive) return type; - visitor.visitObject(type, directive); + // eslint-disable-next-line no-param-reassign + visitor.args = directive; + visitor.visitObject(type); return type; }, [MapperKind.OBJECT_FIELD](fieldConfig, _fieldName, typeName, schema) { @@ -29,15 +31,13 @@ export const createSchemaMapperForVisitor = const [directive] = getDirective(schema, fieldConfig, directiveName) ?? []; if (!directive) return fieldConfig; + // eslint-disable-next-line no-param-reassign + visitor.args = directive; const objectType = schema.getType(typeName); if (isObjectType(objectType)) { - visitor.visitFieldDefinition( - fieldConfig, - { - objectType, - }, - directive, - ); + visitor.visitFieldDefinition(fieldConfig, { + objectType, + }); } return fieldConfig; }, diff --git a/lib/createValidateDirectiveVisitor.ts b/lib/createValidateDirectiveVisitor.ts index 95190b1..a5eb1cc 100644 --- a/lib/createValidateDirectiveVisitor.ts +++ b/lib/createValidateDirectiveVisitor.ts @@ -1,5 +1,3 @@ -import type { DirectiveLocation } from 'graphql'; - import type { ValidateFunction, ValidationDirectiveArgs, @@ -24,11 +22,7 @@ export type CreateValidate = ( export class ConcreteValidateDirectiveVisitor extends ValidateDirectiveVisitorNonTyped { // istanbul ignore next (this shouldn't be used) // eslint-disable-next-line class-methods-use-this - public getValidationForArgs( - _location: DirectiveLocation, - _args: unknown, - _path?: string[], - ): ValidateFunction | undefined { + public getValidationForArgs(): ValidateFunction | undefined { throw new Error( 'ValidateDirectiveVisitor.getValidationForArgs() must be implemented', ); @@ -65,18 +59,15 @@ const createValidateDirectiveVisitor = ({ public static readonly defaultName = defaultName; // eslint-disable-next-line class-methods-use-this - public getValidationForArgs( - _: unknown, - args: TArgs, - ): ValidateFunction | undefined { - const validate = createValidate(args); + public getValidationForArgs(): ValidateFunction | undefined { + const validate = createValidate(this.args); if ( typeof validate === 'function' && !('validateProperties' in validate) ) { Object.defineProperty(validate, 'validateProperties', { value: { - args: args as ValidationDirectiveArgs, + args: this.args, directive: defaultName, }, writable: false, diff --git a/lib/foreignNodeId.ts b/lib/foreignNodeId.ts index f53f6ac..dd353f1 100644 --- a/lib/foreignNodeId.ts +++ b/lib/foreignNodeId.ts @@ -26,12 +26,10 @@ export default class ForeignNodeIdDirective< _ extends ForeignNodeIdContext, > extends ValidateDirectiveVisitorNonTyped { // eslint-disable-next-line class-methods-use-this - public getValidationForArgs( - ___: unknown, - args: Args, - _path: string[], - ): ValidateFunction> | undefined { - const { typename } = args; + public getValidationForArgs(): + | ValidateFunction> + | undefined { + const { typename } = this.args; const wrongUsageErrorMessage = `foreignNodeId directive only works on strings`; const wrongTypeNameErrorMessage = `Converted ID typename does not match. Expected: ${typename}`; const couldNotDecodeErrorMessage = `Could not decode ID to ${typename}`; diff --git a/lib/hasPermissions.ts b/lib/hasPermissions.ts index 7368def..73e6909 100644 --- a/lib/hasPermissions.ts +++ b/lib/hasPermissions.ts @@ -219,9 +219,9 @@ export class HasPermissionsDirectiveVisitor< public getValidationForArgs( location: DirectiveLocation, - args: TArgs, + // args: TArgs, ): ValidateFunction | undefined { - const { permissions, policy } = args; + const { permissions, policy } = this.args; const cacheKey = JSON.stringify(Array.from(permissions).sort()); const isUsedOnInputOrArgument = location === DirectiveLocation.INPUT_FIELD_DEFINITION ||