cabal-version:       2.2

name:                graphql-engine
version:             1.0.0
synopsis:            GraphQL API over Postgres
homepage:            https://www.hasura.io
license:             Apache-2.0
author:              Vamshi Surabhi
maintainer:          vamshi@hasura.io
copyright:           Hasura Inc.
category:            Database
build-type:          Simple
extra-source-files:
  -- We use TH to bake in the server’s version number at compile time. In order
  -- for recompilation detection to work correctly (especially in the presence
  -- of caching) we need to both communicate this data via a file (referenced in
  -- TH with addDependentFile) /and/ add that file to this section of the cabal
  -- file. See: https://github.com/haskell/cabal/issues/4746
  --
  -- This file is intentionally .gitignore'd
  CURRENT_VERSION
  -- These are files referenced by functions from 'file-embed' which uses
  -- addDependentFile internally and has the same issue as above:
  src-rsr/mysql_table_metadata.sql
  src-rsr/mssql_table_metadata.sql
  src-rsr/catalog_versions.txt
  src-rsr/catalog_version.txt


source-repository head
  type:     git
  location: https://github.com/hasura/graphql-engine

flag profiling
  description: Configures the project to be profiling-compatible
  default: False
  manual: True

-- A single flag to enable all optimization-related settings at once, for all
-- hasura code.
--
-- We share this flag name across our Haskell projects so we can switch it on or
-- off for all of them at in our Cabal project files.
flag optimize-hasura
  description: Compile hasura code with appropriate optimizations
  default: True
  manual: False

common common-all
  ghc-options:
    -foptimal-applicative-do
    -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
    -- This is just to keep compile-times in check and might be adjusted later (See mono #2610):
    -fmax-simplifier-iterations=2
    -- Insisting on export lists might help with compile times, and help to document modules:
    -Wmissing-export-lists

  if flag(profiling)
    cpp-options: -DPROFILING

  if flag(optimize-hasura)
    ghc-options:
      -- This is for performance, and works in combination with '-fspecialise-aggressively'
      -- in the graphql-engine 'executable' stanza below, and in any other dependent
      -- executables (See mono #2610):
      -fexpose-all-unfoldings
      -O2
  else
    -- we just want to build fast:
    ghc-options: -O0

  default-language: Haskell2010
  default-extensions:
    AllowAmbiguousTypes
    BangPatterns
    BlockArguments
    ConstraintKinds
    DataKinds
    DefaultSignatures
    DeriveDataTypeable
    DeriveFoldable
    DeriveFunctor
    DeriveGeneric
    DeriveLift
    DeriveTraversable
    DerivingVia
    FlexibleContexts
    FlexibleInstances
    FunctionalDependencies
    GADTs
    GeneralizedNewtypeDeriving
    ImportQualifiedPost
    InstanceSigs
    LambdaCase
    MultiParamTypeClasses
    MultiWayIf
    NamedFieldPuns
    NoImplicitPrelude
    OverloadedStrings
    RankNTypes
    RecordWildCards
    RoleAnnotations
    ScopedTypeVariables
    StandaloneDeriving
    StrictData
    TupleSections
    TypeApplications
    TypeFamilies
    TypeOperators

common common-exe
  ghc-options:
    -threaded -rtsopts
    -- `-I0` disables idle GC. We do this in application code now. See 'ourIdleGC' for details.
    -- `-T` is required to collect the stats we use in 'ourIdleGC'.
    --
    -- `-qn2` limits the parallel GC to at most 2 capabilities. This came up in #3354/#3394, as the
    -- parallel GC was causing significant performance overhead. Folks in #ghc on freenode advised
    -- limiting the parallel GC to 2 or 3 capabilities as a very conservative choice, since more
    -- than that is highly unlikely to ever be helpful. More benchmarking would be useful to know if
    -- this is the right decision. It’s possible it would better to just turn it off completely.
    --
    -- `-kc8K` helps limit memory consumption in websockets (perhaps elsewhere) by making the
    -- cost of a thread's first (and probably only) stack overflow less severe.
    -- See:https://github.com/hasura/graphql-engine/issues/5190
    --
    -- `--disable-delayed-os-memory-return` seems to help lower reported residency, in particular
    -- in situations where we seem to be dealing with haskell heap fragmentation. This is more a
    -- workaround for limitations in monitoring tools than anything...
    "-with-rtsopts=-N -I0 -T -qn2 -kc8K --disable-delayed-os-memory-return"

library dc-api
  import: common-all
  hs-source-dirs:      src-dc-api
  build-depends:       aeson
                     , autodocodec
                     , autodocodec-openapi3
                     , base
                     , bytestring
                     , containers
                     , deepseq
                     , file-embed
                     , hashable
                     , insert-ordered-containers
                     , lens
                     , lens-aeson
                     , mtl
                     , openapi3
                     , scientific
                     , servant
                     , servant-client
                     , servant-client-core
                     , servant-openapi3
                     , servant-server
                     , text
                     , unordered-containers
                     , vector
                     , warp
  if !flag(profiling)
    -- ghc-heap-view can't be built with profiling
    build-depends:     ghc-heap-view

  exposed-modules:     Autodocodec.Extended
                     , Hasura.Backends.DataConnector.API
                     , Hasura.Backends.DataConnector.API.V0.API
                     , Hasura.Backends.DataConnector.API.V0.Column
                     , Hasura.Backends.DataConnector.API.V0.ConfigSchema
                     , Hasura.Backends.DataConnector.API.V0.Expression
                     , Hasura.Backends.DataConnector.API.V0.OrderBy
                     , Hasura.Backends.DataConnector.API.V0.Query
                     , Hasura.Backends.DataConnector.API.V0.Scalar.Type
                     , Hasura.Backends.DataConnector.API.V0.Scalar.Value
                     , Hasura.Backends.DataConnector.API.V0.Schema
                     , Hasura.Backends.DataConnector.API.V0.Table
                     , Hasura.Backends.DataConnector.Agent.Data
                     , Hasura.Backends.DataConnector.Agent.Query
                     , Hasura.Backends.DataConnector.Agent.Schema
                     , Hasura.Backends.DataConnector.Agent.Server

library
  import: common-all
  hs-source-dirs:      src-lib
  build-depends:       Spock-core
                     , aeson
                     , aeson-casing
                     , attoparsec
                     , attoparsec-iso8601 >= 1.0
                     , autodocodec
                     , autodocodec-openapi3
                     , barbies
                     , base
                     , bytestring
                     , containers
                     , data-default
                     , deepseq
                     , dependent-map >=0.4 && <0.5
                     , dependent-sum
                     , either
                     , exceptions
                     , fast-logger
                     , dc-api
                     , free
                     , hashable
                     , hashable-time
                     , http-client-tls
                     , http-conduit
                     , http-media
                     , http-types
                     , ip
                     , kan-extensions
                     , kriti-lang
                     , lifted-base
                     , monad-control
                     , monad-loops
                     , monad-validate
                     , mtl
                     , openapi3
                     , optparse-applicative
                     , parsec
                     , pg-client
                     , postgresql-binary
                     , postgresql-libpq
                     , pretty-simple
                     , process
                     , profunctors
                     , retry
                     , safe-exceptions
                     , scientific
                     , semialign
                     , servant
                     , servant-client
                     , servant-client-core
                     , servant-openapi3
                     , some
                     , split
                     , template-haskell
                     , text
                     , text-builder >= 0.6
                     , th-lift
                     , these
                     , time >= 1.9
                     , time-compat
                     , transformers
                     , transformers-base
                     , unordered-containers >= 0.2.12
                     , url
                     , utf8-string
                     , validation
                     , vector
                     , vector-instances
                     , wai
                     , witch
                     , hashable-time

                     -- Encoder related
                     , uuid
                     , binary
                     , base16-bytestring

                     -- Logging related
                     , network
                     , network-bsd
                     , byteorder

                     -- for parsing RSA keys
                     , cryptonite

                     -- for jwt verification
                     , jose
                     , pem
                     , x509
                     , asn1-encoding
                     , asn1-types

                     -- Server related
                     , warp
                     , lens

                     -- GraphQL related
                     , graphql-parser >=0.2 && <0.3

                     -- URL parser related
                     , network-uri >=2.6.3.0 && <2.7
                     , uri-encode

                     -- String related
                     , case-insensitive
                     , text-conversions

                     -- Http client
                     , wreq
                     , http-client

                     -- ordered map
                     , insert-ordered-containers

                     -- Parsing SemVer
                     , semver

                     -- Templating
                     , mustache
                     , file-embed
                     , shakespeare >= 2.0.22

                     --
                     , data-has
                     -- for src-exec
                     , yaml
                     , template-haskell >= 2.11

                     -- websockets interface related
                     , websockets>=0.12
                     , stm
                     , stm-containers
                     , list-t
                     , async
                     , lifted-async
                     , immortal < 0.3

                     -- logging related
                     , base64-bytestring >= 1.0
                     , auto-update

                     -- regex related
                     , regex-tdfa >=1.3.1 && <1.4

                     -- pretty printer
                     , ansi-wl-pprint

                     -- for capturing various metrics
                     , ekg-core
                     , ekg-json

                     -- metrics for CI integration
                     , ci-info

                     -- serve static files
                     , filepath >= 1.4
                     , mime-types >= 0.1

                     -- for handling posix signals for graceful shutdown
                     , unix
                     -- HTTP compression
                     , zlib

                     -- caching
                     , psqueues >= 0.2

                     -- testing
                     , QuickCheck
                     , quickcheck-instances

                     , directory

                     , random
                     , mmorph
                     , http-api-data
                     , lens-aeson

                     , semigroups >= 0.19.1

                     -- scheduled triggers
                     , cron >= 0.6.2
                     -- needed for deriving via
                     , semigroups >= 0.19

                     -- mssql support
                     , odbc
                     , resource-pool

                     -- bigquery support
                     , memory
                     , x509-store
                     , connection
                     , tls
                     , x509-validation
                     , data-default-class
                     , x509-system
                     , tagged
                     -- mysql
                     , mysql
                     , mysql-simple

  if !flag(profiling)
    -- ghc-heap-view can't be built with profiling
    build-depends:     ghc-heap-view

  exposed-modules:     Control.Arrow.Extended
                     , Control.Arrow.Interpret
                     , Control.Arrow.Trans
                     , Control.Concurrent.Extended
                     , Control.Lens.Extended
                     , Control.Monad.Stateless
                     , Control.Monad.Trans.Managed
                     , Control.Monad.Unique
                     , Data.Aeson.Extended
                     , Data.Aeson.Ordered
                     , Data.Environment
                     , Data.HashMap.Strict.Extended
                     , Data.HashMap.Strict.Multi
                     , Data.HashMap.Strict.NonEmpty
                     , Data.HashMap.Strict.InsOrd.Extended
                     , Data.IntMap.Strict.Extended
                     , Data.List.Extended
                     , Data.Parser.CacheControl
                     , Data.Parser.Expires
                     , Data.Parser.JSONPath
                     , Data.Sequence.NonEmpty
                     , Data.Set.Extended
                     , Data.SqlCommenter
                     , Data.TByteString
                     , Data.Text.Casing
                     , Data.Text.Extended
                     , Data.Text.NonEmpty
                     , Data.Time.Clock.Units
                     , Data.Trie
                     , Data.URL.Template
                     , Database.MSSQL.Transaction
                     , Database.MSSQL.Pool
                     , GHC.AssertNF.CPP
                     , GHC.Stats.Extended
                     , Hasura.App
                     , Hasura.Metadata.Class

                     , Hasura.Base.Error
                     , Hasura.Base.Instances

                     , Hasura.Backends.BigQuery.Connection
                     , Hasura.Backends.BigQuery.Execute
                     , Hasura.Backends.BigQuery.DDL
                     , Hasura.Backends.BigQuery.DDL.BoolExp
                     , Hasura.Backends.BigQuery.DDL.RunSQL
                     , Hasura.Backends.BigQuery.DDL.Source
                     , Hasura.Backends.BigQuery.DDL.ComputedField
                     , Hasura.Backends.BigQuery.FromIr
                     , Hasura.Backends.BigQuery.Instances.API
                     , Hasura.Backends.BigQuery.Instances.Execute
                     , Hasura.Backends.BigQuery.Instances.Schema
                     , Hasura.Backends.BigQuery.Instances.Transport
                     , Hasura.Backends.BigQuery.Instances.Types
                     , Hasura.Backends.BigQuery.Instances.Metadata
                     , Hasura.Backends.BigQuery.Meta
                     , Hasura.Backends.BigQuery.Plan
                     , Hasura.Backends.BigQuery.Source
                     , Hasura.Backends.BigQuery.ToQuery
                     , Hasura.Backends.BigQuery.Types

                     , Hasura.Backends.MSSQL.Connection
                     , Hasura.Backends.MSSQL.DDL
                     , Hasura.Backends.MSSQL.DDL.BoolExp
                     , Hasura.Backends.MSSQL.DDL.EventTrigger
                     , Hasura.Backends.MSSQL.DDL.RunSQL
                     , Hasura.Backends.MSSQL.DDL.Source
                     , Hasura.Backends.MSSQL.DDL.Source.Version
                     , Hasura.Backends.MSSQL.Execute.QueryTags
                     , Hasura.Backends.MSSQL.Execute.Delete
                     , Hasura.Backends.MSSQL.Execute.Insert
                     , Hasura.Backends.MSSQL.Execute.Update
                     , Hasura.Backends.MSSQL.FromIr
                     , Hasura.Backends.MSSQL.FromIr.Constants
                     , Hasura.Backends.MSSQL.FromIr.Delete
                     , Hasura.Backends.MSSQL.FromIr.Expression
                     , Hasura.Backends.MSSQL.FromIr.Insert
                     , Hasura.Backends.MSSQL.FromIr.MutationResponse
                     , Hasura.Backends.MSSQL.FromIr.Query
                     , Hasura.Backends.MSSQL.FromIr.SelectIntoTempTable
                     , Hasura.Backends.MSSQL.FromIr.Update
                     , Hasura.Backends.MSSQL.Instances.API
                     , Hasura.Backends.MSSQL.Instances.Execute
                     , Hasura.Backends.MSSQL.Instances.Metadata
                     , Hasura.Backends.MSSQL.Instances.Schema
                     , Hasura.Backends.MSSQL.Instances.Transport
                     , Hasura.Backends.MSSQL.Instances.Types
                     , Hasura.Backends.MSSQL.Meta
                     , Hasura.Backends.MSSQL.Plan
                     , Hasura.Backends.MSSQL.Schema.IfMatched
                     , Hasura.Backends.MSSQL.SQL.Value
                     , Hasura.Backends.MSSQL.SQL.Error
                     , Hasura.Backends.MSSQL.ToQuery
                     , Hasura.Backends.MSSQL.Types
                     , Hasura.Backends.MSSQL.Types.Insert
                     , Hasura.Backends.MSSQL.Types.Instances
                     , Hasura.Backends.MSSQL.Types.Internal
                     , Hasura.Backends.MSSQL.Types.Update

                     , Hasura.Backends.Postgres.Connection
                     , Hasura.Backends.Postgres.Connection.MonadTx
                     , Hasura.Backends.Postgres.Connection.Settings
                     , Hasura.Backends.Postgres.DDL
                     , Hasura.Backends.Postgres.DDL.BoolExp
                     , Hasura.Backends.Postgres.DDL.ComputedField
                     , Hasura.Backends.Postgres.DDL.EventTrigger
                     , Hasura.Backends.Postgres.DDL.Function
                     , Hasura.Backends.Postgres.DDL.RunSQL
                     , Hasura.Backends.Postgres.DDL.Source
                     , Hasura.Backends.Postgres.DDL.Source.Version
                     , Hasura.Backends.Postgres.DDL.Table
                     , Hasura.Backends.Postgres.Execute.Subscription
                     , Hasura.Backends.Postgres.Execute.Insert
                     , Hasura.Backends.Postgres.Execute.Mutation
                     , Hasura.Backends.Postgres.Execute.Prepare
                     , Hasura.Backends.Postgres.Execute.Types
                     , Hasura.Backends.Postgres.Instances.API
                     , Hasura.Backends.Postgres.Instances.Execute
                     , Hasura.Backends.Postgres.Instances.Metadata
                     , Hasura.Backends.Postgres.Instances.Schema
                     , Hasura.Backends.Postgres.Instances.Transport
                     , Hasura.Backends.Postgres.Instances.Types
                     , Hasura.Backends.Postgres.Schema.OnConflict
                     , Hasura.Backends.Postgres.SQL.DML
                     , Hasura.Backends.Postgres.SQL.Error
                     , Hasura.Backends.Postgres.SQL.IdentifierUniqueness
                     , Hasura.Backends.Postgres.SQL.Types
                     , Hasura.Backends.Postgres.SQL.Value
                     , Hasura.Backends.Postgres.Translate.BoolExp
                     , Hasura.Backends.Postgres.Translate.Column
                     , Hasura.Backends.Postgres.Translate.Delete
                     , Hasura.Backends.Postgres.Translate.Insert
                     , Hasura.Backends.Postgres.Translate.Mutation
                     , Hasura.Backends.Postgres.Translate.Returning
                     , Hasura.Backends.Postgres.Translate.Select
                     , Hasura.Backends.Postgres.Translate.Select.Aggregate
                     , Hasura.Backends.Postgres.Translate.Select.AnnotatedFieldJSON
                     , Hasura.Backends.Postgres.Translate.Select.Connection
                     , Hasura.Backends.Postgres.Translate.Select.Internal.Aliases
                     , Hasura.Backends.Postgres.Translate.Select.Internal.Extractor
                     , Hasura.Backends.Postgres.Translate.Select.Internal.GenerateSelect
                     , Hasura.Backends.Postgres.Translate.Select.Internal.Helpers
                     , Hasura.Backends.Postgres.Translate.Select.Internal.JoinTree
                     , Hasura.Backends.Postgres.Translate.Select.Internal.OrderBy
                     , Hasura.Backends.Postgres.Translate.Select.Internal.Process
                     , Hasura.Backends.Postgres.Translate.Select.Simple
                     , Hasura.Backends.Postgres.Translate.Select.Streaming
                     , Hasura.Backends.Postgres.Translate.Types
                     , Hasura.Backends.Postgres.Translate.Update
                     , Hasura.Backends.Postgres.Types.BoolExp
                     , Hasura.Backends.Postgres.Types.CitusExtraTableMetadata
                     , Hasura.Backends.Postgres.Types.ComputedField
                     , Hasura.Backends.Postgres.Types.Function
                     , Hasura.Backends.Postgres.Types.Column
                     , Hasura.Backends.Postgres.Types.Insert
                     , Hasura.Backends.Postgres.Types.Table
                     , Hasura.Backends.Postgres.Types.Update

                     , Hasura.Backends.MySQL.DataLoader.Execute
                     , Hasura.Backends.MySQL.DataLoader.Plan
                     , Hasura.Backends.MySQL.Types
                     , Hasura.Backends.MySQL.Types.Internal
                     , Hasura.Backends.MySQL.Types.Instances
                     , Hasura.Backends.MySQL.Plan
                     , Hasura.Backends.MySQL.FromIr
                     , Hasura.Backends.MySQL.Connection
                     , Hasura.Backends.MySQL.Meta
                     , Hasura.Backends.MySQL.Instances.Types
                     , Hasura.Backends.MySQL.Instances.Metadata
                     , Hasura.Backends.MySQL.Instances.Schema
                     , Hasura.Backends.MySQL.Instances.Execute
                     , Hasura.Backends.MySQL.Instances.Transport
                     , Hasura.Backends.MySQL.SQL
                     , Hasura.Backends.MySQL.ToQuery
                     , Hasura.Backends.MySQL.Instances.API

                     -- GraphQL Data Connector
                     , Hasura.Backends.DataConnector.Adapter.API
                     , Hasura.Backends.DataConnector.Adapter.Backend
                     , Hasura.Backends.DataConnector.Adapter.Execute
                     , Hasura.Backends.DataConnector.Adapter.Metadata
                     , Hasura.Backends.DataConnector.Adapter.Schema
                     , Hasura.Backends.DataConnector.Adapter.Transport
                     , Hasura.Backends.DataConnector.Adapter.Types
                     , Hasura.Backends.DataConnector.Agent.Client
                     , Hasura.Backends.DataConnector.IR.Column
                     , Hasura.Backends.DataConnector.IR.Expression
                     , Hasura.Backends.DataConnector.IR.Export
                     , Hasura.Backends.DataConnector.IR.Function
                     , Hasura.Backends.DataConnector.IR.Name
                     , Hasura.Backends.DataConnector.IR.OrderBy
                     , Hasura.Backends.DataConnector.IR.Query
                     , Hasura.Backends.DataConnector.IR.Scalar.Type
                     , Hasura.Backends.DataConnector.IR.Scalar.Value
                     , Hasura.Backends.DataConnector.IR.Table
                     , Hasura.Backends.DataConnector.Plan
                     , Hasura.Backends.DataConnector.Schema.Column
                     , Hasura.Backends.DataConnector.Schema.Table

                     -- Exposed for benchmark:
                     , Hasura.Cache.Bounded
                     , Hasura.Logging
                     , Hasura.HTTP
                     , Hasura.Incremental
                     , Hasura.Server.App
                     , Hasura.Server.Auth
                     , Hasura.Server.Init
                     , Hasura.Server.Init.Config
                     , Hasura.Server.API.Backend
                     , Hasura.Server.API.Instances
                     , Hasura.Server.API.Metadata
                     , Hasura.Server.API.Query
                     , Hasura.Server.API.V2Query
                     , Hasura.Server.Utils
                     , Hasura.Server.Version
                     , Hasura.Server.Limits
                     , Hasura.Server.Logging
                     , Hasura.Server.Migrate
                     , Hasura.Server.Compression
                     , Hasura.Server.Types
                     , Hasura.Server.API.PGDump
                     , Hasura.Server.Rest
                     , Hasura.Server.OpenAPI
                     , Hasura.Prelude

                     , Hasura.EncJSON
                     , Hasura.GraphQL.Execute.Query
                     , Hasura.GraphQL.Logging
                     , Hasura.Incremental.Select
                     , Hasura.RQL.DML.Select
                     , Hasura.RQL.Types.Run
                     , Hasura.Session

                     , Hasura.Server.API.Config
                     , Hasura.Server.Telemetry
                     , Hasura.Server.Metrics
                     , Hasura.Server.Telemetry.Counters
                     , Hasura.Server.Auth.JWT
                     , Hasura.GC
                     , Hasura.Incremental.Internal.Cache
                     , Hasura.Incremental.Internal.Dependency
                     , Hasura.Incremental.Internal.Rule
                     , Hasura.Server.Auth.WebHook
                     , Hasura.Server.Middleware
                     , Hasura.Server.Cors
                     , Hasura.Server.CheckUpdates
                     , Hasura.Server.SchemaCacheRef
                     , Hasura.Server.SchemaUpdate
                     , Hasura.Server.Migrate.Version
                     , Hasura.Server.Migrate.Internal
                     , Hasura.Server.Auth.JWT.Internal
                     , Hasura.Server.Auth.JWT.Logging
                     , Hasura.RQL.Types.Action
                     , Hasura.RQL.Types.Allowlist
                     , Hasura.RQL.Types.ApiLimit
                     , Hasura.RQL.Types.Backend
                     , Hasura.RQL.Types.Column
                     , Hasura.RQL.Types.Common
                     , Hasura.RQL.Types.ComputedField
                     , Hasura.RQL.Types.CustomTypes
                     , Hasura.RQL.Types.Endpoint
                     , Hasura.RQL.Types.Endpoint.Trie
                     , Hasura.RQL.Types.EventTrigger
                     , Hasura.RQL.Types.Eventing
                     , Hasura.RQL.Types.Eventing.Backend
                     , Hasura.RQL.Types.GraphqlSchemaIntrospection
                     , Hasura.RQL.Types.Function
                     , Hasura.RQL.Types.Instances
                     , Hasura.RQL.Types.BoolExp
                     , Hasura.RQL.Types.Metadata
                     , Hasura.RQL.Types.Metadata.Backend
                     , Hasura.RQL.Types.Metadata.Instances
                     , Hasura.RQL.Types.Metadata.Object
                     , Hasura.RQL.Types.Network
                     , Hasura.RQL.Types.Permission
                     , Hasura.RQL.Types.QueryCollection
                     , Hasura.RQL.Types.QueryTags
                     , Hasura.RQL.Types.Relationships.Local
                     , Hasura.RQL.Types.Relationships.Remote
                     , Hasura.RQL.Types.Relationships.ToSchema
                     , Hasura.RQL.Types.Relationships.ToSource
                     , Hasura.RQL.Types.RemoteSchema
                     , Hasura.RQL.Types.ResultCustomization
                     , Hasura.RQL.Types.ScheduledTrigger
                     , Hasura.RQL.Types.SchemaCache
                     , Hasura.RQL.Types.SchemaCache.Build
                     , Hasura.RQL.Types.SchemaCacheTypes
                     , Hasura.RQL.Types.Source
                     , Hasura.RQL.Types.SourceCustomization
                     , Hasura.RQL.Types.Subscription
                     , Hasura.RQL.Types.Table
                     , Hasura.RQL.Types.Roles
                     , Hasura.RQL.Types.Roles.Internal
                     , Hasura.RQL.DDL.Action
                     , Hasura.RQL.DDL.ApiLimit
                     , Hasura.RQL.DDL.ComputedField
                     , Hasura.RQL.DDL.CustomTypes
                     , Hasura.RQL.DDL.Endpoint
                     , Hasura.RQL.DDL.GraphqlSchemaIntrospection
                     , Hasura.RQL.DDL.InheritedRoles
                     , Hasura.RQL.DDL.Headers
                     , Hasura.RQL.DDL.Metadata
                     , Hasura.RQL.DDL.Metadata.Types
                     , Hasura.RQL.DDL.Permission
                     , Hasura.RQL.DDL.Permission.Internal
                     , Hasura.RQL.DDL.QueryCollection
                     , Hasura.RQL.DDL.QueryTags
                     , Hasura.RQL.DDL.Relationship
                     , Hasura.RQL.DDL.Relationship.Rename
                     , Hasura.RQL.DDL.RemoteRelationship
                     , Hasura.RQL.DDL.RemoteRelationship.Validate
                     , Hasura.RQL.DDL.RemoteSchema
                     , Hasura.RQL.DDL.RemoteSchema.Permission
                     , Hasura.RQL.DDL.Webhook.Transform
                     , Hasura.RQL.DDL.Webhook.Transform.Body
                     , Hasura.RQL.DDL.Webhook.Transform.Class
                     , Hasura.RQL.DDL.Webhook.Transform.Headers
                     , Hasura.RQL.DDL.Webhook.Transform.Method
                     , Hasura.RQL.DDL.Webhook.Transform.QueryParams
                     , Hasura.RQL.DDL.Webhook.Transform.Validation
                     , Hasura.RQL.DDL.Webhook.Transform.Url
                     , Hasura.RQL.DDL.Schema
                     , Hasura.RQL.DDL.Schema.Cache
                     , Hasura.RQL.DDL.Schema.Cache.Common
                     , Hasura.RQL.DDL.Schema.Cache.Dependencies
                     , Hasura.RQL.DDL.Schema.Cache.Fields
                     , Hasura.RQL.DDL.Schema.Cache.Permission
                     , Hasura.RQL.DDL.Schema.Catalog
                     , Hasura.RQL.DDL.Schema.Diff
                     , Hasura.RQL.DDL.Schema.LegacyCatalog
                     , Hasura.RQL.DDL.Schema.Enum
                     , Hasura.RQL.DDL.Schema.Function
                     , Hasura.RQL.DDL.Schema.Rename
                     , Hasura.RQL.DDL.Schema.Table
                     , Hasura.RQL.DDL.Schema.Source
                     , Hasura.RQL.DDL.EventTrigger
                     , Hasura.RQL.DDL.ScheduledTrigger
                     , Hasura.RQL.DDL.Network
                     , Hasura.RQL.DML.Count
                     , Hasura.RQL.DML.Delete
                     , Hasura.RQL.DML.Insert
                     , Hasura.RQL.DML.Internal
                     , Hasura.RQL.DML.Update
                     , Hasura.RQL.DML.Types
                     , Hasura.RQL.IR.Action
                     , Hasura.RQL.IR.BoolExp
                     , Hasura.RQL.IR.Conflict
                     , Hasura.RQL.IR.Delete
                     , Hasura.RQL.IR.Insert
                     , Hasura.RQL.IR.OrderBy
                     , Hasura.RQL.IR.Returning
                     , Hasura.RQL.IR.Select
                     , Hasura.RQL.IR.RemoteSchema
                     , Hasura.RQL.IR.Update
                     , Hasura.RQL.IR.Root
                     , Hasura.RQL.IR
                     , Hasura.GraphQL.Analyse
                     , Hasura.GraphQL.Context
                     , Hasura.GraphQL.Execute
                     , Hasura.GraphQL.Execute.Action
                     , Hasura.GraphQL.Execute.Action.Subscription
                     , Hasura.GraphQL.Execute.Action.Types
                     , Hasura.GraphQL.Execute.Backend
                     , Hasura.GraphQL.Execute.Common
                     , Hasura.GraphQL.Execute.Inline
                     , Hasura.GraphQL.Execute.Instances
                     , Hasura.GraphQL.Execute.Subscription.Options
                     , Hasura.GraphQL.Execute.Subscription.Plan
                     , Hasura.GraphQL.Execute.Subscription.Poll
                     , Hasura.GraphQL.Execute.Subscription.Poll.Common
                     , Hasura.GraphQL.Execute.Subscription.Poll.LiveQuery
                     , Hasura.GraphQL.Execute.Subscription.Poll.StreamingQuery
                     , Hasura.GraphQL.Execute.Subscription.State
                     , Hasura.GraphQL.Execute.Subscription.TMap
                     , Hasura.GraphQL.Execute.Subscription.Types
                     , Hasura.GraphQL.Execute.Mutation
                     , Hasura.GraphQL.Execute.Remote
                     , Hasura.GraphQL.Execute.RemoteJoin
                     , Hasura.GraphQL.Execute.RemoteJoin.Types
                     , Hasura.GraphQL.Execute.RemoteJoin.Collect
                     , Hasura.GraphQL.Execute.RemoteJoin.Join
                     , Hasura.GraphQL.Execute.RemoteJoin.RemoteSchema
                     , Hasura.GraphQL.Execute.RemoteJoin.Source
                     , Hasura.GraphQL.Execute.Resolve
                     , Hasura.GraphQL.Execute.Types
                     , Hasura.GraphQL.Explain
                     , Hasura.GraphQL.Namespace
                     , Hasura.GraphQL.ParameterizedQueryHash
                     , Hasura.GraphQL.Parser
                     , Hasura.GraphQL.Parser.Class
                     , Hasura.GraphQL.Parser.Class.Parse
                     , Hasura.GraphQL.Parser.Collect
                     , Hasura.GraphQL.Parser.Column
                     , Hasura.GraphQL.Parser.Constants
                     , Hasura.GraphQL.Parser.Directives
                     , Hasura.GraphQL.Parser.Internal.Convert
                     , Hasura.GraphQL.Parser.Internal.Input
                     , Hasura.GraphQL.Parser.Internal.Parser
                     , Hasura.GraphQL.Parser.Internal.Scalars
                     , Hasura.GraphQL.Parser.Internal.TypeChecking
                     , Hasura.GraphQL.Parser.Internal.Types
                     , Hasura.GraphQL.Parser.Monad
                     , Hasura.GraphQL.Parser.Schema
                     , Hasura.GraphQL.Parser.Schema.Convert
                     , Hasura.GraphQL.RemoteServer
                     , Hasura.GraphQL.Schema
                     , Hasura.GraphQL.Schema.Action
                     , Hasura.GraphQL.Schema.Backend
                     , Hasura.GraphQL.Schema.BoolExp
                     , Hasura.GraphQL.Schema.Build
                     , Hasura.GraphQL.Schema.Common
                     , Hasura.GraphQL.Schema.Introspect
                     , Hasura.GraphQL.Schema.Instances
                     , Hasura.GraphQL.Schema.Mutation
                     , Hasura.GraphQL.Schema.OrderBy
                     , Hasura.GraphQL.Schema.Postgres
                     , Hasura.GraphQL.Schema.Remote
                     , Hasura.GraphQL.Schema.RemoteRelationship
                     , Hasura.GraphQL.Schema.Select
                     , Hasura.GraphQL.Schema.SubscriptionStream
                     , Hasura.GraphQL.Schema.Table
                     , Hasura.GraphQL.Schema.Update
                     , Hasura.GraphQL.Transport.Backend
                     , Hasura.GraphQL.Transport.HTTP
                     , Hasura.GraphQL.Transport.HTTP.Protocol
                     , Hasura.GraphQL.Transport.Instances
                     , Hasura.GraphQL.Transport.WSServerApp
                     , Hasura.GraphQL.Transport.WebSocket
                     , Hasura.GraphQL.Transport.WebSocket.Types
                     , Hasura.GraphQL.Transport.WebSocket.Protocol
                     , Hasura.GraphQL.Transport.WebSocket.Server

                     , Hasura.Eventing.Common
                     , Hasura.Eventing.EventTrigger
                     , Hasura.Eventing.HTTP
                     , Hasura.Eventing.ScheduledTrigger
                     , Hasura.Eventing.ScheduledTrigger.Types
                     , Data.GADT.Compare.Extended
                     , Data.Tuple.Extended
                     , Hasura.SQL.AnyBackend
                     , Hasura.SQL.Backend
                     , Hasura.SQL.BackendMap
                     , Hasura.SQL.TH
                     , Hasura.SQL.Tag
                     , Hasura.SQL.GeoJSON
                     , Hasura.SQL.Time
                     , Hasura.SQL.Types
                     , Hasura.SQL.Value
                     , Hasura.SQL.WKT
                     , Hasura.Tracing
                     , Hasura.QueryTags
                     , Network.HTTP.Client.Transformable
                     , Network.HTTP.Client.Manager
                     , Network.HTTP.Client.DynamicTlsPermissions
                     , Network.HTTP.Client.Restricted
                     , Network.HTTP.Client.Blocklisting
                     , Network.HTTP.Client.CreateManager
                     , Network.URI.Extended
                     , Network.Wai.Extended
                     , Network.Wai.Handler.WebSockets.Custom


executable graphql-engine
  import: common-all, common-exe

  if flag(optimize-hasura)
    ghc-options:
      -- This is for performance (See mono #2610):
      -fspecialise-aggressively

  hs-source-dirs:    src-exec
  main-is:           Main.hs
  build-depends:     base
                   , graphql-engine
                   , bytestring
                   , kan-extensions
                   , pg-client
                   , text
                   , text-conversions
                   , time
                   , unix
                   , ekg-core

test-suite graphql-engine-tests
  import: common-all, common-exe
  type: exitcode-stdio-1.0
  build-depends:
      aeson
    , async
    , attoparsec
    , base
    , bytestring
    , case-insensitive
    , containers
    , cron
    , dependent-map
    , dependent-sum
    , ekg-core
    , dc-api
    , free
    , graphql-engine
    , graphql-parser
    , data-has
    , hedgehog
    , hspec >=2.8.3 && <3
    , hspec-core >=2.8.3 && <3
    , hspec-expectations
    , hspec-expectations-lifted
    , hspec-hedgehog
    , http-client
    , http-client-tls
    , http-types
    , immortal
    , insert-ordered-containers
    , jose
    , kan-extensions
    , lens
    , lens-aeson
    , lifted-base
    , list-t
    , mmorph
    , monad-control
    , mtl
    , natural-transformation >=0.4 && <0.5
    , network-uri
    , openapi3
    , optparse-applicative
    , pg-client
    , process
    , QuickCheck
    , safe
    , scientific
    , split
    , stm
    , stm-containers
    , template-haskell
    , text
    , time
    , transformers
    , transformers-base
    , unordered-containers
    , utf8-string
    , uuid
    , vector
    , yaml
    -- mssql support
    , odbc
    , resource-pool
  hs-source-dirs: src-test
  main-is: Main.hs
  other-modules:
    Control.Concurrent.ExtendedSpec
    Data.HashMap.Strict.ExtendedSpec
    Data.NonNegativeIntSpec
    Data.Parser.CacheControlSpec
    Data.Parser.JSONPathSpec
    Data.Parser.URLTemplateSpec
    Data.Parser.RemoteRelationshipSpec
    Data.Text.RawString
    Data.TimeSpec
    Data.TrieSpec
    Database.MSSQL.TransactionSpec
    Hasura.AppSpec
    Hasura.Backends.DataConnector.API.V0Spec
    Hasura.Backends.DataConnector.API.V0.ColumnSpec
    Hasura.Backends.DataConnector.API.V0.ConfigSchemaSpec
    Hasura.Backends.DataConnector.API.V0.ExpressionSpec
    Hasura.Backends.DataConnector.API.V0.OrderBySpec
    Hasura.Backends.DataConnector.API.V0.QuerySpec
    Hasura.Backends.DataConnector.API.V0.Scalar.TypeSpec
    Hasura.Backends.DataConnector.API.V0.Scalar.ValueSpec
    Hasura.Backends.DataConnector.API.V0.SchemaSpec
    Hasura.Backends.DataConnector.API.V0.TableSpec
    Hasura.Backends.DataConnector.RQLGenerator
    Hasura.Backends.DataConnector.RQLGenerator.GenAnnSelectG
    Hasura.Backends.DataConnector.RQLGenerator.GenCommon
    Hasura.Backends.DataConnector.RQLGenerator.GenTablePermG
    Hasura.Backends.DataConnector.RQLGenerator.GenSelectArgsG
    Hasura.Backends.DataConnector.RQLGenerator.GenSelectFromG
    Hasura.Backends.MSSQL.ErrorSpec
    Hasura.Backends.MySQL.DataLoader.ExecuteTests
    Hasura.Backends.Postgres.RQLGenerator
    Hasura.Backends.Postgres.RQLGenerator.GenAssociatedTypes
    Hasura.Backends.Postgres.RQLGenerator.GenAnnSelectG
    Hasura.Backends.Postgres.RQLGenerator.GenSelectArgsG
    Hasura.Backends.Postgres.RQLGenerator.GenSelectFromG
    Hasura.Backends.Postgres.RQLGenerator.GenTablePermG
    Hasura.EventingSpec
    Hasura.Generator.Common
    Hasura.GraphQL.NamespaceSpec
    Hasura.GraphQL.Parser.DirectivesTest
    Hasura.GraphQL.Parser.TestUtils
    Hasura.GraphQL.Schema.Build.UpdateSpec
    Hasura.GraphQL.Schema.RemoteTest
    Hasura.IncrementalSpec
    Hasura.StreamingSubscriptionSpec
    Hasura.QuickCheck.Instances
    Hasura.RQL.IR.Generator
    Hasura.RQL.IR.SelectSpec
    Hasura.RQL.MetadataSpec
    Hasura.RQL.PermissionSpec
    Hasura.RQL.Types.AllowlistSpec
    Hasura.RQL.Types.CommonSpec
    Hasura.RQL.Types.EndpointSpec
    Hasura.RQL.Types.TableSpec
    Hasura.RQL.WebhookTransformsSpec
    Hasura.Server.Auth.JWTSpec
    Hasura.Server.AuthSpec
    Hasura.Server.MigrateSpec
    Hasura.Server.TelemetrySpec
    Hasura.SessionSpec
    Hasura.SQL.WKTSpec
    Network.HTTP.Client.TransformableSpec
    Test.Aeson.Utils
    Test.Autodocodec.Extended
    Test.Parser.Field
    Test.Parser.Monad
    Test.Parser.Internal
    Test.Parser.Expectation
    Test.QuickCheck.Extended

test-suite tests-hspec
  import: common-all, common-exe
  type: exitcode-stdio-1.0
  build-tool-depends: hspec-discover:hspec-discover
  build-depends:
      QuickCheck
    , Spock-core
    , aeson
    , aeson-casing
    , aeson-qq
    , async
    , base
    , bytestring
    , case-insensitive
    , conduit
    , containers
    , cron
    , dependent-map
    , dependent-sum
    , ekg-core
    , dc-api
    , graphql-engine
    , graphql-parser
    , haskell-src-meta
    , hedgehog
    , hspec
    , hspec >=2.8.3 && <3
    , hspec-core >=2.8.3 && <3
    , hspec-discover >=2.8.3 && <3
    , hspec-expectations
    , hspec-expectations-lifted
    , hspec-hedgehog
    , http-client
    , http-client-tls
    , http-conduit
    , http-types
    , HUnit
    , insert-ordered-containers
    , jose
    , kan-extensions
    , lens
    , lens-aeson
    , libyaml
    , lifted-base
    , mmorph
    , monad-control
    , monad-logger
    , morpheus-graphql
    , mtl
    , mysql
    , mysql-simple
    , natural-transformation >=0.4 && <0.5
    , network
    , network-uri
    , odbc
    , optparse-applicative
    , parsec
    , pg-client
    , postgresql-libpq
    , postgresql-simple
    , process
    , resource-pool
    , resourcet
    , safe
    , safe-exceptions
    , scientific
    , split
    , stm
    , template-haskell
    , text
    , text-conversions
    , th-lift
    , th-lift-instances
    , time
    , transformers-base
    , typed-process
    , unix
    , unliftio-core
    , unordered-containers
    , utf8-string
    , vector
    , warp
    , websockets
    , yaml
  hs-source-dirs: tests-hspec
  -- Turning off optimizations is intentional; tests aren't
  -- performance sensitive and waiting for compilation is a problem.
  ghc-options: -Wall -O0 -threaded
  main-is: Spec.hs
  other-modules:
    SpecHook

 -- Harness
    Harness.Constants
    Harness.Env
    Harness.Exceptions
    Harness.GraphqlEngine
    Harness.Http
    Harness.RemoteServer
    Harness.TestEnvironment
    Harness.Webhook
    Harness.Yaml

 -- Harness.Backend
    Harness.Backend.BigQuery
    Harness.Backend.Citus
    Harness.Backend.DataConnector
    Harness.Backend.Mysql
    Harness.Backend.Postgres
    Harness.Backend.Sqlserver

 -- Harness.Test
    Harness.Test.BackendType
    Harness.Test.Context
    Harness.Test.Schema

 -- Harness.Quoter
    Harness.Quoter.Graphql
    Harness.Quoter.Sql
    Harness.Quoter.Yaml

 -- Test
    Test.ArrayRelationshipsSpec
    Test.BasicFieldsSpec
    Test.ColumnPresetsSpec
    Test.CustomFieldNamesSpec
    Test.DirectivesSpec
    Test.DC.QuerySpec
    Test.EventTriggersRunSQLSpec
    Test.HelloWorldSpec
    Test.InsertCheckPermissionSpec
    Test.InsertDefaultsSpec
    Test.InsertEnumColumnSpec
    Test.LimitOffsetSpec
    Test.NestedRelationshipsSpec
    Test.ObjectRelationshipsLimitSpec
    Test.ObjectRelationshipsSpec
    Test.OrderingSpec
    Test.PostgresTypesSpec
    Test.PrimaryKeySpec
    Test.RemoteRelationship.FromRemoteSchemaSpec
    Test.RemoteRelationship.MetadataAPI.ClearMetadataSpec
    Test.RemoteRelationship.MetadataAPI.Common
    Test.RemoteRelationship.MetadataAPI.DropSource.DBtoDBRelationshipSpec
    Test.RemoteRelationship.MetadataAPI.DropSource.RSToDBRelationshipSpec
    Test.RemoteRelationship.XToDBArrayRelationshipSpec
    Test.RemoteRelationship.XToDBObjectRelationshipSpec
    Test.RemoteRelationship.XToRemoteSchemaRelationshipSpec
    Test.RequestHeadersSpec
    Test.RunSQLSpec
    Test.SQLServer.InsertVarcharColumnSpec
    Test.SelectSpec
    Test.SerializationSpec
    Test.ServiceLivenessSpec
    Test.ViewsSpec
    Test.WhereSpec

test-suite tests-dc-api
  import: common-all, common-exe
  type: exitcode-stdio-1.0
  build-depends:
    , aeson
    , autodocodec
    , autodocodec-openapi3
    , base
    , bytestring
    , deepseq
    , file-embed
    , dc-api
    , hashable
    , hspec
    , hspec-core
    , hspec-expectations-pretty-diff
    , http-client
    , lens
    , lens-aeson
    , mtl
    , network-uri
    , openapi3
    , optparse-applicative
    , scientific
    , servant
    , servant-client
    , servant-client-core
    , servant-openapi3
    , text
    , unordered-containers
    , vector
  hs-source-dirs: tests-dc-api
  -- Turning off optimizations is intentional; tests aren't
  -- performance sensitive and waiting for compilation is a problem.
  ghc-options: -Wall -O0 -threaded
  main-is: Main.hs
  other-modules:
      Command
    , Paths_graphql_engine
    , Test.Data
    , Test.ConfigSchemaSpec
    , Test.QuerySpec
    , Test.QuerySpec.BasicSpec
    , Test.QuerySpec.RelationshipsSpec
    , Test.SchemaSpec