diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 All notable changes to this package are documented in this file. This project adheres to [Haskell PVP](https://pvp.haskell.org/) versioning.
 
+## 0.4.2.0
+
+- #87, Expose internal functions
+
 ## 0.4.1.0
 
 - #85, Implement `dumpQuery` to dump JSONPath query
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2024-2025 Taimoor Zaeem
+Copyright (c) 2024-2026 Taimoor Zaeem
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # aeson-jsonpath
 
-[![Build](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/build.yml/badge.svg)](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/build.yml) [![hackage-docs](https://img.shields.io/badge/hackage-v0.4.1.0-blue)](https://hackage.haskell.org/package/aeson-jsonpath) [![Compliance](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/compliance.yml/badge.svg)](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/compliance.yml)
+[![Build](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/build.yml/badge.svg)](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/build.yml) [![hackage-docs](https://img.shields.io/badge/hackage-v0.4.2.0-blue)](https://hackage.haskell.org/package/aeson-jsonpath) [![Compliance](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/compliance.yml/badge.svg)](https://github.com/taimoorzaeem/aeson-jsonpath/actions/workflows/compliance.yml)
 
 Run [RFC 9535](https://www.rfc-editor.org/rfc/rfc9535) compliant JSONPath queries on [Data.Aeson](https://hackage.haskell.org/package/aeson).
 
diff --git a/aeson-jsonpath.cabal b/aeson-jsonpath.cabal
--- a/aeson-jsonpath.cabal
+++ b/aeson-jsonpath.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               aeson-jsonpath
-version:            0.4.1.0
+version:            0.4.2.0
 synopsis:           Parse and run JSONPath queries on Aeson documents
 description:        RFC 9535 compliant JSONPath parsing and querying
                     package. JSONPath is similar to XPath for querying
@@ -90,6 +90,7 @@
   main-is:            Main.hs
   other-modules:      ComplianceSpec
                       Paths_aeson_jsonpath
+                      -- required by cabal spec 3.0
   autogen-modules:    Paths_aeson_jsonpath
   build-depends:      aeson                     >= 2.0.3 && < 2.5
                     , aeson-jsonpath
diff --git a/src/Data/Aeson/JSONPath/Parser.hs b/src/Data/Aeson/JSONPath/Parser.hs
--- a/src/Data/Aeson/JSONPath/Parser.hs
+++ b/src/Data/Aeson/JSONPath/Parser.hs
@@ -11,17 +11,17 @@
 This module is responsible for parsing the JSONPath query
 -}
 module Data.Aeson.JSONPath.Parser
-  ( pQuery )
+  (
+    module Data.Aeson.JSONPath.Parser.Query
+  , module Data.Aeson.JSONPath.Parser.Name
+  , module Data.Aeson.JSONPath.Parser.Number
+  , module Data.Aeson.JSONPath.Parser.Filter
+  , module Data.Aeson.JSONPath.Parser.Common
+  )
   where
 
-import qualified Text.ParserCombinators.Parsec  as P
-
-import Data.Aeson.JSONPath.Query ()
-import Data.Aeson.JSONPath.Parser.Query (pRootQuery)
-import Data.Aeson.JSONPath.Types
-
-import Prelude
-
--- | Query parser
-pQuery :: P.Parser Query
-pQuery = pRootQuery <* P.eof
+import Data.Aeson.JSONPath.Parser.Query
+import Data.Aeson.JSONPath.Parser.Name
+import Data.Aeson.JSONPath.Parser.Number
+import Data.Aeson.JSONPath.Parser.Filter
+import Data.Aeson.JSONPath.Parser.Common
diff --git a/src/Data/Aeson/JSONPath/Parser/Common.hs b/src/Data/Aeson/JSONPath/Parser/Common.hs
--- a/src/Data/Aeson/JSONPath/Parser/Common.hs
+++ b/src/Data/Aeson/JSONPath/Parser/Common.hs
@@ -1,8 +1,4 @@
-module Data.Aeson.JSONPath.Parser.Common
-  ( pSpaces
-  , pUnicodeChar
-  )
-  where
+module Data.Aeson.JSONPath.Parser.Common where
 
 import qualified Text.ParserCombinators.Parsec as P
 import           Text.ParserCombinators.Parsec ((<?>))
diff --git a/src/Data/Aeson/JSONPath/Parser/Filter.hs b/src/Data/Aeson/JSONPath/Parser/Filter.hs
--- a/src/Data/Aeson/JSONPath/Parser/Filter.hs
+++ b/src/Data/Aeson/JSONPath/Parser/Filter.hs
@@ -1,7 +1,5 @@
 {-# OPTIONS_GHC -Wno-unused-do-bind #-}
-module Data.Aeson.JSONPath.Parser.Filter
-  ( pFilter )
-  where
+module Data.Aeson.JSONPath.Parser.Filter where
 
 import qualified Data.Text                      as T
 import qualified Text.ParserCombinators.Parsec  as P
diff --git a/src/Data/Aeson/JSONPath/Parser/Name.hs b/src/Data/Aeson/JSONPath/Parser/Name.hs
--- a/src/Data/Aeson/JSONPath/Parser/Name.hs
+++ b/src/Data/Aeson/JSONPath/Parser/Name.hs
@@ -1,9 +1,5 @@
 {-# OPTIONS_GHC -Wno-unused-do-bind #-}
-module Data.Aeson.JSONPath.Parser.Name
-  ( pSingleQuotted
-  , pDoubleQuotted
-  )
-  where
+module Data.Aeson.JSONPath.Parser.Name where
 
 import qualified Text.ParserCombinators.Parsec  as P
 
diff --git a/src/Data/Aeson/JSONPath/Parser/Number.hs b/src/Data/Aeson/JSONPath/Parser/Number.hs
--- a/src/Data/Aeson/JSONPath/Parser/Number.hs
+++ b/src/Data/Aeson/JSONPath/Parser/Number.hs
@@ -1,10 +1,5 @@
 {-# OPTIONS_GHC -Wno-unused-do-bind #-}
-module Data.Aeson.JSONPath.Parser.Number
-  ( pSignedInt
-  , pScientific
-  , pDoubleScientific
-  )
-  where
+module Data.Aeson.JSONPath.Parser.Number where
 
 import qualified Text.ParserCombinators.Parsec  as P
 
diff --git a/src/Data/Aeson/JSONPath/Parser/Query.hs b/src/Data/Aeson/JSONPath/Parser/Query.hs
--- a/src/Data/Aeson/JSONPath/Parser/Query.hs
+++ b/src/Data/Aeson/JSONPath/Parser/Query.hs
@@ -1,8 +1,5 @@
 {-# OPTIONS_GHC -Wno-unused-do-bind #-}
-module Data.Aeson.JSONPath.Parser.Query
-  ( pRootQuery
-  , pCurrentQuery )
-  where
+module Data.Aeson.JSONPath.Parser.Query where
 
 import qualified Data.Text                      as T
 import qualified Text.ParserCombinators.Parsec  as P
@@ -18,6 +15,10 @@
 import Data.Aeson.JSONPath.Types
 
 import Prelude
+
+-- | Query parser
+pQuery :: P.Parser Query
+pQuery = pRootQuery <* P.eof
 
 pRootQuery :: P.Parser Query
 pRootQuery = do
diff --git a/src/Data/Aeson/JSONPath/Query.hs b/src/Data/Aeson/JSONPath/Query.hs
--- a/src/Data/Aeson/JSONPath/Query.hs
+++ b/src/Data/Aeson/JSONPath/Query.hs
@@ -12,9 +12,15 @@
 module Data.Aeson.JSONPath.Query
   (
     module Data.Aeson.JSONPath.Query.Query
+  , module Data.Aeson.JSONPath.Query.Segment
+  , module Data.Aeson.JSONPath.Query.Selector
+  , module Data.Aeson.JSONPath.Query.Filter
   , module Data.Aeson.JSONPath.Query.DumpQuery
   )
   where
 
 import Data.Aeson.JSONPath.Query.Query
+import Data.Aeson.JSONPath.Query.Segment
+import Data.Aeson.JSONPath.Query.Selector hiding (toPathKey)
+import Data.Aeson.JSONPath.Query.Filter
 import Data.Aeson.JSONPath.Query.DumpQuery
diff --git a/src/Data/Aeson/JSONPath/Query/DumpQuery.hs b/src/Data/Aeson/JSONPath/Query/DumpQuery.hs
--- a/src/Data/Aeson/JSONPath/Query/DumpQuery.hs
+++ b/src/Data/Aeson/JSONPath/Query/DumpQuery.hs
@@ -1,8 +1,6 @@
 {-# LANGUAGE LambdaCase      #-}
 {-# LANGUAGE RecordWildCards #-}
-module Data.Aeson.JSONPath.Query.DumpQuery
-  ( dumpQuery )
-  where
+module Data.Aeson.JSONPath.Query.DumpQuery where
 
 import Data.Text                       (Text)
 
diff --git a/src/Data/Aeson/JSONPath/Query/Filter.hs b/src/Data/Aeson/JSONPath/Query/Filter.hs
--- a/src/Data/Aeson/JSONPath/Query/Filter.hs
+++ b/src/Data/Aeson/JSONPath/Query/Filter.hs
@@ -1,8 +1,5 @@
 {-# LANGUAGE RecordWildCards #-}
-module Data.Aeson.JSONPath.Query.Filter
-  ( filterOrExpr
-  , filterOrExprLocated )
-  where
+module Data.Aeson.JSONPath.Query.Filter where
 
 import Data.Aeson                      (Value)
 import Data.Vector                     (Vector)
diff --git a/src/Data/Aeson/JSONPath/Query/Query.hs b/src/Data/Aeson/JSONPath/Query/Query.hs
--- a/src/Data/Aeson/JSONPath/Query/Query.hs
+++ b/src/Data/Aeson/JSONPath/Query/Query.hs
@@ -1,9 +1,5 @@
 {-# LANGUAGE RecordWildCards #-}
-module Data.Aeson.JSONPath.Query.Query
-  ( qQuery
-  , qQueryLocated
-  )
-  where
+module Data.Aeson.JSONPath.Query.Query where
 
 import Control.Monad                   (join)
 import Data.Aeson                      (Value)
diff --git a/src/Data/Aeson/JSONPath/Query/Segment.hs b/src/Data/Aeson/JSONPath/Query/Segment.hs
--- a/src/Data/Aeson/JSONPath/Query/Segment.hs
+++ b/src/Data/Aeson/JSONPath/Query/Segment.hs
@@ -1,9 +1,5 @@
 {-# LANGUAGE RecordWildCards #-}
-module Data.Aeson.JSONPath.Query.Segment
-  ( qQuerySegment
-  , qQuerySegmentLocated
-  )
-  where
+module Data.Aeson.JSONPath.Query.Segment where
 
 import Control.Monad (join)
 import Data.Aeson    (Value)
@@ -15,7 +11,7 @@
 import qualified Data.Vector        as V
 
 import Data.Aeson.JSONPath.Types
-import Data.Aeson.JSONPath.Query.Selector
+import Data.Aeson.JSONPath.Query.Selector hiding (toPathKey)
 
 import Prelude
 
diff --git a/src/Data/Aeson/JSONPath/Query/Selector.hs b/src/Data/Aeson/JSONPath/Query/Selector.hs
--- a/src/Data/Aeson/JSONPath/Query/Selector.hs
+++ b/src/Data/Aeson/JSONPath/Query/Selector.hs
@@ -1,9 +1,5 @@
 {-# LANGUAGE RecordWildCards #-}
-module Data.Aeson.JSONPath.Query.Selector
-  ( qSelector
-  , qSelectorLocated
-  )
-  where
+module Data.Aeson.JSONPath.Query.Selector where
 
 import Data.Aeson     (Value)
 import Data.Vector    (Vector)
diff --git a/src/Data/Aeson/JSONPath/Types/Filter.hs b/src/Data/Aeson/JSONPath/Types/Filter.hs
--- a/src/Data/Aeson/JSONPath/Types/Filter.hs
+++ b/src/Data/Aeson/JSONPath/Types/Filter.hs
@@ -1,22 +1,5 @@
 {-# LANGUAGE DeriveLift #-}
-module Data.Aeson.JSONPath.Types.Filter
-  (LogicalOrExpr (..)
-  , LogicalAndExpr (..)
-  , BasicExpr (..)
-  , TestExpr (..)
-  , ComparisonExpr (..)
-  , ComparisonOp (..)
-  , Comparable (..)
-  , Literal (..)
-  , SingularQueryType (..)
-  , SingularQuery (..)
-  , SingularQuerySegment (..)
-  , FunctionExpr (..)
-  , FunctionName (..)
-  , FunctionArg (..)
-  , FunctionResult (..)
-  )
-  where
+module Data.Aeson.JSONPath.Types.Filter where
 
 import Data.Aeson                  (Value)
 import Data.Text                   (Text)
diff --git a/src/Data/Aeson/JSONPath/Types/Query.hs b/src/Data/Aeson/JSONPath/Types/Query.hs
--- a/src/Data/Aeson/JSONPath/Types/Query.hs
+++ b/src/Data/Aeson/JSONPath/Types/Query.hs
@@ -1,10 +1,5 @@
 {-# LANGUAGE DeriveLift #-}
-module Data.Aeson.JSONPath.Types.Query
-  ( Query (..)
-  , QueryType (..)
-  , QueryState (..)
-  )
-  where
+module Data.Aeson.JSONPath.Types.Query where
 
 import Data.Aeson  (Value)
 import Data.Vector (Vector)
diff --git a/src/Data/Aeson/JSONPath/Types/Segment.hs b/src/Data/Aeson/JSONPath/Types/Segment.hs
--- a/src/Data/Aeson/JSONPath/Types/Segment.hs
+++ b/src/Data/Aeson/JSONPath/Types/Segment.hs
@@ -1,10 +1,5 @@
 {-# LANGUAGE DeriveLift #-}
-module Data.Aeson.JSONPath.Types.Segment
-  (Segment (..)
-  , QuerySegment (..)
-  , SegmentType (..)
-  )
-  where
+module Data.Aeson.JSONPath.Types.Segment where
 
 import Data.Aeson.JSONPath.Types.Selector (Selector (..))
 import Data.Text                          (Text)
diff --git a/src/Data/Aeson/JSONPath/Types/Selector.hs b/src/Data/Aeson/JSONPath/Types/Selector.hs
--- a/src/Data/Aeson/JSONPath/Types/Selector.hs
+++ b/src/Data/Aeson/JSONPath/Types/Selector.hs
@@ -1,7 +1,5 @@
 {-# LANGUAGE DeriveLift #-}
-module Data.Aeson.JSONPath.Types.Selector
-  (Selector (..))
-  where
+module Data.Aeson.JSONPath.Types.Selector where
 
 import Data.Aeson.JSONPath.Types.Filter (LogicalOrExpr (..))
 import Data.Text                        (Text)
