Implementing GraphQL APIs with TypeScript

Understand how to build and consume GraphQL APIs effectively in TypeScript applications.

0 likes
9 views

Rule Content

title: Implementing GraphQL APIs with TypeScript
description: Enforce best practices for building and consuming GraphQL APIs in TypeScript applications.
category: TypeScript Cursor Rules
rules:
  - id: graphql-schema-naming-conventions
    description: Ensure consistent naming conventions in GraphQL schemas.
    pattern: |
      type [A-Z][a-zA-Z0-9]* {
        [a-z][a-zA-Z0-9]*: [A-Za-z][a-zA-Z0-9]*!
      }
    message: "Type names should be in PascalCase, and field names in camelCase."
    severity: error
    references:
      - https://compositecode.blog/2023/07/24/graphql-schema-standards/

  - id: graphql-fragments-for-type-safety
    description: Utilize GraphQL fragments to enhance type safety and maintainability.
    pattern: |
      fragment [A-Z][a-zA-Z0-9]* on [A-Z][a-zA-Z0-9]* {
        [a-z][a-zA-Z0-9]*: [A-Za-z][a-zA-Z0-9]*!
      }
    message: "Define reusable fragments to ensure consistent and type-safe data structures."
    severity: warning
    references:
      - https://the-guild.dev/blog/graphql-with-typescript-done-right

  - id: graphql-pagination-implementation
    description: Implement pagination for handling large datasets in GraphQL queries.
    pattern: |
      type [A-Z][a-zA-Z0-9]*Connection {
        edges: \[[A-Z][a-zA-Z0-9]*Edge\]!
        pageInfo: PageInfo!
      }
    message: "Use connection types with edges and pageInfo for efficient pagination."
    severity: error
    references:
      - https://compositecode.blog/2023/08/01/graphql-best-practices-imho/

  - id: graphql-error-handling
    description: Standardize error handling in GraphQL APIs.
    pattern: |
      type Error {
        message: String!
        code: String!
      }
    message: "Define a consistent Error type with message and code fields for error responses."
    severity: warning
    references:
      - https://compositecode.blog/2023/08/01/graphql-best-practices-imho/

  - id: typescript-strict-mode
    description: Enforce strict mode in TypeScript for enhanced type safety.
    pattern: |
      "strict": true
    message: "Enable 'strict' mode in tsconfig.json to catch potential type errors."
    severity: error
    references:
      - https://medium.com/@nikhithsomasani/best-practices-for-using-typescript-in-2025-a-guide-for-experienced-developers-4fca1cfdf052

  - id: typescript-template-literal-types
    description: Leverage template literal types for dynamic string-based types.
    pattern: |
      type [A-Z][a-zA-Z0-9]* = `api/\${[a-z][a-zA-Z0-9]*}`;
    message: "Use template literal types to enforce specific string patterns."
    severity: warning
    references:
      - https://medium.com/@nikhithsomasani/best-practices-for-using-typescript-in-2025-a-guide-for-experienced-developers-4fca1cfdf052

  - id: typescript-satisfies-operator
    description: Use the 'satisfies' operator for type assertions.
    pattern: |
      const [a-z][a-zA-Z0-9]* = { [a-z][a-zA-Z0-9]*: [a-zA-Z0-9]* } satisfies { [a-z][a-zA-Z0-9]*: [A-Za-z][a-zA-Z0-9]* };
    message: "Apply the 'satisfies' operator to enforce type constraints while maintaining flexibility."
    severity: warning
    references:
      - https://medium.com/@nikhithsomasani/best-practices-for-using-typescript-in-2025-a-guide-for-experienced-developers-4fca1cfdf052

  - id: typescript-utility-types
    description: Utilize TypeScript utility types for type transformations.
    pattern: |
      type [A-Z][a-zA-Z0-9]* = Partial<[A-Z][a-zA-Z0-9]*>;
    message: "Use utility types like Partial, Pick, Omit, etc., for efficient type transformations."
    severity: warning
    references:
      - https://medium.com/@nikhithsomasani/best-practices-for-using-typescript-in-2025-a-guide-for-experienced-developers-4fca1cfdf052

  - id: typescript-as-const
    description: Prefer 'as const' for exact type matches.
    pattern: |
      const [a-z][a-zA-Z0-9]* = \[[a-zA-Z0-9, ]*\] as const;
    message: "Use 'as const' to ensure literals are inferred as their exact types."
    severity: warning
    references:
      - https://medium.com/@nikhithsomasani/best-practices-for-using-typescript-in-2025-a-guide-for-experienced-developers-4fca1cfdf052

  - id: typescript-avoid-any-unknown
    description: Avoid overusing 'any' and 'unknown' types.
    pattern: |
      function [a-z][a-zA-Z0-9]*\([a-z][a-zA-Z0-9]*: any\) {
        // ...
      }
    message: "Limit the use of 'any' and 'unknown' types to maintain type safety."
    severity: error
    references:
      - https://medium.com/@nikhithsomasani/best-practices-for-using-typescript-in-2025-a-guide-for-experienced-developers-4fca1cfdf052

  - id: typescript-runtime-validation
    description: Integrate runtime validation with libraries like 'zod' or 'io-ts'.
    pattern: |
      import { z } from 'zod';
      const [A-Z][a-zA-Z0-9]*Schema = z.object({
        [a-z][a-zA-Z0-9]*: z.[a-zA-Z0-9]*(),
      });
    message: "Use runtime validation libraries to complement TypeScript's compile-time checks."
    severity: warning
    references:
      - https://medium.com/@nikhithsomasani/best-practices-for-using-typescript-in-2025-a-guide-for-experienced-developers-4fca1cfdf052