@graphoria/server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +10 -0
  3. package/README.md +129 -0
  4. package/cli.ts +105 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/src/ai/agent/agent.d.ts +37 -0
  8. package/dist/src/ai/agent/agent.d.ts.map +1 -0
  9. package/dist/src/ai/agent/index.d.ts +3 -0
  10. package/dist/src/ai/agent/index.d.ts.map +1 -0
  11. package/dist/src/ai/agent/providers/anthropic.d.ts +10 -0
  12. package/dist/src/ai/agent/providers/anthropic.d.ts.map +1 -0
  13. package/dist/src/ai/agent/providers/index.d.ts +8 -0
  14. package/dist/src/ai/agent/providers/index.d.ts.map +1 -0
  15. package/dist/src/ai/agent/providers/ollama.d.ts +11 -0
  16. package/dist/src/ai/agent/providers/ollama.d.ts.map +1 -0
  17. package/dist/src/ai/agent/providers/openai.d.ts +14 -0
  18. package/dist/src/ai/agent/providers/openai.d.ts.map +1 -0
  19. package/dist/src/ai/agent/types.d.ts +51 -0
  20. package/dist/src/ai/agent/types.d.ts.map +1 -0
  21. package/dist/src/ai/ask-field.test.d.ts +2 -0
  22. package/dist/src/ai/ask-field.test.d.ts.map +1 -0
  23. package/dist/src/ai/index.d.ts +7 -0
  24. package/dist/src/ai/index.d.ts.map +1 -0
  25. package/dist/src/ai/mcp/create-server.d.ts +14 -0
  26. package/dist/src/ai/mcp/create-server.d.ts.map +1 -0
  27. package/dist/src/ai/mcp/create-server.test.d.ts +2 -0
  28. package/dist/src/ai/mcp/create-server.test.d.ts.map +1 -0
  29. package/dist/src/ai/mcp/index.d.ts +13 -0
  30. package/dist/src/ai/mcp/index.d.ts.map +1 -0
  31. package/dist/src/ai/mcp/index.test.d.ts +2 -0
  32. package/dist/src/ai/mcp/index.test.d.ts.map +1 -0
  33. package/dist/src/ai/mcp/instructions.d.ts +2 -0
  34. package/dist/src/ai/mcp/instructions.d.ts.map +1 -0
  35. package/dist/src/ai/tools/agent.d.ts +4 -0
  36. package/dist/src/ai/tools/agent.d.ts.map +1 -0
  37. package/dist/src/ai/tools/agent.test.d.ts +2 -0
  38. package/dist/src/ai/tools/agent.test.d.ts.map +1 -0
  39. package/dist/src/ai/tools/core.d.ts +75 -0
  40. package/dist/src/ai/tools/core.d.ts.map +1 -0
  41. package/dist/src/ai/tools/query-data.d.ts +35 -0
  42. package/dist/src/ai/tools/query-data.d.ts.map +1 -0
  43. package/dist/src/analyzeQuery/analyzers/fragmentAnalyzer.d.ts +5 -0
  44. package/dist/src/analyzeQuery/analyzers/fragmentAnalyzer.d.ts.map +1 -0
  45. package/dist/src/analyzeQuery/analyzers/operationAnalyzer.d.ts +6 -0
  46. package/dist/src/analyzeQuery/analyzers/operationAnalyzer.d.ts.map +1 -0
  47. package/dist/src/analyzeQuery/analyzers/selectionAnalyzer.d.ts +6 -0
  48. package/dist/src/analyzeQuery/analyzers/selectionAnalyzer.d.ts.map +1 -0
  49. package/dist/src/analyzeQuery/analyzers/variableAnalyzer.d.ts +4 -0
  50. package/dist/src/analyzeQuery/analyzers/variableAnalyzer.d.ts.map +1 -0
  51. package/dist/src/analyzeQuery/depthLimit.d.ts +16 -0
  52. package/dist/src/analyzeQuery/depthLimit.d.ts.map +1 -0
  53. package/dist/src/analyzeQuery/depthLimit.test.d.ts +2 -0
  54. package/dist/src/analyzeQuery/depthLimit.test.d.ts.map +1 -0
  55. package/dist/src/analyzeQuery/directiveUtils.d.ts +4 -0
  56. package/dist/src/analyzeQuery/directiveUtils.d.ts.map +1 -0
  57. package/dist/src/analyzeQuery/directiveUtils.test.d.ts +2 -0
  58. package/dist/src/analyzeQuery/directiveUtils.test.d.ts.map +1 -0
  59. package/dist/src/analyzeQuery/index.d.ts +5 -0
  60. package/dist/src/analyzeQuery/index.d.ts.map +1 -0
  61. package/dist/src/analyzeQuery/index.test.d.ts +2 -0
  62. package/dist/src/analyzeQuery/index.test.d.ts.map +1 -0
  63. package/dist/src/analyzeQuery/resolveVariables.d.ts +71 -0
  64. package/dist/src/analyzeQuery/resolveVariables.d.ts.map +1 -0
  65. package/dist/src/analyzeQuery/resolveVariables.test.d.ts +2 -0
  66. package/dist/src/analyzeQuery/resolveVariables.test.d.ts.map +1 -0
  67. package/dist/src/analyzeQuery/staticValues.test.d.ts +2 -0
  68. package/dist/src/analyzeQuery/staticValues.test.d.ts.map +1 -0
  69. package/dist/src/analyzeQuery/typeUtils.d.ts +9 -0
  70. package/dist/src/analyzeQuery/typeUtils.d.ts.map +1 -0
  71. package/dist/src/analyzeQuery/types.d.ts +54 -0
  72. package/dist/src/analyzeQuery/types.d.ts.map +1 -0
  73. package/dist/src/analyzeQuery/valueExtractors.d.ts +4 -0
  74. package/dist/src/analyzeQuery/valueExtractors.d.ts.map +1 -0
  75. package/dist/src/authentication/duration.d.ts +14 -0
  76. package/dist/src/authentication/duration.d.ts.map +1 -0
  77. package/dist/src/authentication/duration.test.d.ts +2 -0
  78. package/dist/src/authentication/duration.test.d.ts.map +1 -0
  79. package/dist/src/authentication/index.d.ts +4 -0
  80. package/dist/src/authentication/index.d.ts.map +1 -0
  81. package/dist/src/authentication/index.test.d.ts +2 -0
  82. package/dist/src/authentication/index.test.d.ts.map +1 -0
  83. package/dist/src/authentication/jwt.d.ts +10 -0
  84. package/dist/src/authentication/jwt.d.ts.map +1 -0
  85. package/dist/src/authentication/jwt.test.d.ts +2 -0
  86. package/dist/src/authentication/jwt.test.d.ts.map +1 -0
  87. package/dist/src/authentication/paseto.d.ts +7 -0
  88. package/dist/src/authentication/paseto.d.ts.map +1 -0
  89. package/dist/src/authentication/paseto.test.d.ts +2 -0
  90. package/dist/src/authentication/paseto.test.d.ts.map +1 -0
  91. package/dist/src/authentication/tokenRepository.d.ts +14 -0
  92. package/dist/src/authentication/tokenRepository.d.ts.map +1 -0
  93. package/dist/src/authentication/tokenRepository.test.d.ts +2 -0
  94. package/dist/src/authentication/tokenRepository.test.d.ts.map +1 -0
  95. package/dist/src/authentication/types.d.ts +42 -0
  96. package/dist/src/authentication/types.d.ts.map +1 -0
  97. package/dist/src/cli/seedAuth.d.ts +4 -0
  98. package/dist/src/cli/seedAuth.d.ts.map +1 -0
  99. package/dist/src/cli/seedAuth.test.d.ts +2 -0
  100. package/dist/src/cli/seedAuth.test.d.ts.map +1 -0
  101. package/dist/src/cli/seedAuthArgs.d.ts +9 -0
  102. package/dist/src/cli/seedAuthArgs.d.ts.map +1 -0
  103. package/dist/src/config/helpers/cronHelper.d.ts +21 -0
  104. package/dist/src/config/helpers/cronHelper.d.ts.map +1 -0
  105. package/dist/src/config/helpers/cronHelper.test.d.ts +2 -0
  106. package/dist/src/config/helpers/cronHelper.test.d.ts.map +1 -0
  107. package/dist/src/config/helpers/index.d.ts +4 -0
  108. package/dist/src/config/helpers/index.d.ts.map +1 -0
  109. package/dist/src/config/helpers/operationHelper.d.ts +44 -0
  110. package/dist/src/config/helpers/operationHelper.d.ts.map +1 -0
  111. package/dist/src/config/helpers/queueHelper.d.ts +20 -0
  112. package/dist/src/config/helpers/queueHelper.d.ts.map +1 -0
  113. package/dist/src/config/helpers/queueHelper.test.d.ts +2 -0
  114. package/dist/src/config/helpers/queueHelper.test.d.ts.map +1 -0
  115. package/dist/src/config/index.d.ts +236 -0
  116. package/dist/src/config/index.d.ts.map +1 -0
  117. package/dist/src/config/types/ai.d.ts +29 -0
  118. package/dist/src/config/types/ai.d.ts.map +1 -0
  119. package/dist/src/config/types/auth.d.ts +112 -0
  120. package/dist/src/config/types/auth.d.ts.map +1 -0
  121. package/dist/src/config/types/configuration.d.ts +61 -0
  122. package/dist/src/config/types/configuration.d.ts.map +1 -0
  123. package/dist/src/config/types/cron.d.ts +81 -0
  124. package/dist/src/config/types/cron.d.ts.map +1 -0
  125. package/dist/src/config/types/db.d.ts +210 -0
  126. package/dist/src/config/types/db.d.ts.map +1 -0
  127. package/dist/src/config/types/index.d.ts +17 -0
  128. package/dist/src/config/types/index.d.ts.map +1 -0
  129. package/dist/src/config/types/operation.d.ts +226 -0
  130. package/dist/src/config/types/operation.d.ts.map +1 -0
  131. package/dist/src/config/types/queue.d.ts +142 -0
  132. package/dist/src/config/types/queue.d.ts.map +1 -0
  133. package/dist/src/config/types/remote-rest.d.ts +18 -0
  134. package/dist/src/config/types/remote-rest.d.ts.map +1 -0
  135. package/dist/src/config/types/remote-schema.d.ts +27 -0
  136. package/dist/src/config/types/remote-schema.d.ts.map +1 -0
  137. package/dist/src/config/types/virtual-columns.d.ts +89 -0
  138. package/dist/src/config/types/virtual-columns.d.ts.map +1 -0
  139. package/dist/src/config/types/virtual-columns.test.d.ts +2 -0
  140. package/dist/src/config/types/virtual-columns.test.d.ts.map +1 -0
  141. package/dist/src/configuration/getSchemas/index.d.ts +867 -0
  142. package/dist/src/configuration/getSchemas/index.d.ts.map +1 -0
  143. package/dist/src/configuration/getSchemas/mergeEntities/index.d.ts +412 -0
  144. package/dist/src/configuration/getSchemas/mergeEntities/index.d.ts.map +1 -0
  145. package/dist/src/configuration/getSchemas/type-definition-generator/index.d.ts +16 -0
  146. package/dist/src/configuration/getSchemas/type-definition-generator/index.d.ts.map +1 -0
  147. package/dist/src/configuration/getSchemas/type-definition-generator/index.test.d.ts +2 -0
  148. package/dist/src/configuration/getSchemas/type-definition-generator/index.test.d.ts.map +1 -0
  149. package/dist/src/configuration/gql/buildExecute.d.ts +31 -0
  150. package/dist/src/configuration/gql/buildExecute.d.ts.map +1 -0
  151. package/dist/src/configuration/gql/buildExecute.test.d.ts +2 -0
  152. package/dist/src/configuration/gql/buildExecute.test.d.ts.map +1 -0
  153. package/dist/src/configuration/gql/gqlAuthOperations.d.ts +9 -0
  154. package/dist/src/configuration/gql/gqlAuthOperations.d.ts.map +1 -0
  155. package/dist/src/configuration/gql/gqlAuthOperations.test.d.ts +2 -0
  156. package/dist/src/configuration/gql/gqlAuthOperations.test.d.ts.map +1 -0
  157. package/dist/src/configuration/gql/handleGraphQLRequestFactory.d.ts +28 -0
  158. package/dist/src/configuration/gql/handleGraphQLRequestFactory.d.ts.map +1 -0
  159. package/dist/src/configuration/gql/handleGraphQLRequestFactory.test.d.ts +2 -0
  160. package/dist/src/configuration/gql/handleGraphQLRequestFactory.test.d.ts.map +1 -0
  161. package/dist/src/configuration/gql/handleGraphQLSubscriptionFactory.d.ts +19 -0
  162. package/dist/src/configuration/gql/handleGraphQLSubscriptionFactory.d.ts.map +1 -0
  163. package/dist/src/configuration/index.d.ts +719 -0
  164. package/dist/src/configuration/index.d.ts.map +1 -0
  165. package/dist/src/configuration/rest/generateOpenAPI.d.ts +19 -0
  166. package/dist/src/configuration/rest/generateOpenAPI.d.ts.map +1 -0
  167. package/dist/src/configuration/rest/handleRESTRequestFactory.d.ts +12 -0
  168. package/dist/src/configuration/rest/handleRESTRequestFactory.d.ts.map +1 -0
  169. package/dist/src/configuration/rest/handleRESTRequestFactory.test.d.ts +2 -0
  170. package/dist/src/configuration/rest/handleRESTRequestFactory.test.d.ts.map +1 -0
  171. package/dist/src/configuration/rest/index.d.ts +20 -0
  172. package/dist/src/configuration/rest/index.d.ts.map +1 -0
  173. package/dist/src/configuration/rest/openApiErrors.d.ts +71 -0
  174. package/dist/src/configuration/rest/openApiErrors.d.ts.map +1 -0
  175. package/dist/src/console/App.d.ts +3 -0
  176. package/dist/src/console/App.d.ts.map +1 -0
  177. package/dist/src/console/Login.d.ts +6 -0
  178. package/dist/src/console/Login.d.ts.map +1 -0
  179. package/dist/src/console/api.d.ts +17 -0
  180. package/dist/src/console/api.d.ts.map +1 -0
  181. package/dist/src/console/api.test.d.ts +2 -0
  182. package/dist/src/console/api.test.d.ts.map +1 -0
  183. package/dist/src/console/client.d.ts +67 -0
  184. package/dist/src/console/client.d.ts.map +1 -0
  185. package/dist/src/console/frontend.d.ts +8 -0
  186. package/dist/src/console/frontend.d.ts.map +1 -0
  187. package/dist/src/console/pages/ConfigPage.d.ts +2 -0
  188. package/dist/src/console/pages/ConfigPage.d.ts.map +1 -0
  189. package/dist/src/console/pages/RolesPage.d.ts +2 -0
  190. package/dist/src/console/pages/RolesPage.d.ts.map +1 -0
  191. package/dist/src/console/pages/StatusPage.d.ts +2 -0
  192. package/dist/src/console/pages/StatusPage.d.ts.map +1 -0
  193. package/dist/src/console/pages/TablesPage.d.ts +2 -0
  194. package/dist/src/console/pages/TablesPage.d.ts.map +1 -0
  195. package/dist/src/console/useApi.d.ts +8 -0
  196. package/dist/src/console/useApi.d.ts.map +1 -0
  197. package/dist/src/cron/index.d.ts +63 -0
  198. package/dist/src/cron/index.d.ts.map +1 -0
  199. package/dist/src/databases/auth/auth-operations.d.ts +11 -0
  200. package/dist/src/databases/auth/auth-operations.d.ts.map +1 -0
  201. package/dist/src/databases/auth/password.d.ts +3 -0
  202. package/dist/src/databases/auth/password.d.ts.map +1 -0
  203. package/dist/src/databases/auth/password.test.d.ts +2 -0
  204. package/dist/src/databases/auth/password.test.d.ts.map +1 -0
  205. package/dist/src/databases/common.d.ts +53 -0
  206. package/dist/src/databases/common.d.ts.map +1 -0
  207. package/dist/src/databases/common.test.d.ts +2 -0
  208. package/dist/src/databases/common.test.d.ts.map +1 -0
  209. package/dist/src/databases/core/executor.d.ts +10 -0
  210. package/dist/src/databases/core/executor.d.ts.map +1 -0
  211. package/dist/src/databases/core/executor.test.d.ts +2 -0
  212. package/dist/src/databases/core/executor.test.d.ts.map +1 -0
  213. package/dist/src/databases/core/function-mapping.d.ts +38 -0
  214. package/dist/src/databases/core/function-mapping.d.ts.map +1 -0
  215. package/dist/src/databases/core/identifier.d.ts +2 -0
  216. package/dist/src/databases/core/identifier.d.ts.map +1 -0
  217. package/dist/src/databases/core/identifier.test.d.ts +2 -0
  218. package/dist/src/databases/core/identifier.test.d.ts.map +1 -0
  219. package/dist/src/databases/core/query-builder.d.ts +64 -0
  220. package/dist/src/databases/core/query-builder.d.ts.map +1 -0
  221. package/dist/src/databases/core/query-builder.test.d.ts +2 -0
  222. package/dist/src/databases/core/query-builder.test.d.ts.map +1 -0
  223. package/dist/src/databases/directives.d.ts +16 -0
  224. package/dist/src/databases/directives.d.ts.map +1 -0
  225. package/dist/src/databases/directives.test.d.ts +2 -0
  226. package/dist/src/databases/directives.test.d.ts.map +1 -0
  227. package/dist/src/databases/engines/mssql/auth.d.ts +9 -0
  228. package/dist/src/databases/engines/mssql/auth.d.ts.map +1 -0
  229. package/dist/src/databases/engines/mssql/auth.test.d.ts +2 -0
  230. package/dist/src/databases/engines/mssql/auth.test.d.ts.map +1 -0
  231. package/dist/src/databases/engines/mssql/connection.d.ts +14 -0
  232. package/dist/src/databases/engines/mssql/connection.d.ts.map +1 -0
  233. package/dist/src/databases/engines/mssql/format.d.ts +5 -0
  234. package/dist/src/databases/engines/mssql/format.d.ts.map +1 -0
  235. package/dist/src/databases/engines/mssql/getStructure.d.ts +48 -0
  236. package/dist/src/databases/engines/mssql/getStructure.d.ts.map +1 -0
  237. package/dist/src/databases/engines/mssql/getViews.d.ts +7 -0
  238. package/dist/src/databases/engines/mssql/getViews.d.ts.map +1 -0
  239. package/dist/src/databases/engines/mssql/query/index.d.ts +7 -0
  240. package/dist/src/databases/engines/mssql/query/index.d.ts.map +1 -0
  241. package/dist/src/databases/engines/mssql/query/index.test.d.ts +2 -0
  242. package/dist/src/databases/engines/mssql/query/index.test.d.ts.map +1 -0
  243. package/dist/src/databases/engines/mysql/auth.d.ts +9 -0
  244. package/dist/src/databases/engines/mysql/auth.d.ts.map +1 -0
  245. package/dist/src/databases/engines/mysql/auth.test.d.ts +2 -0
  246. package/dist/src/databases/engines/mysql/auth.test.d.ts.map +1 -0
  247. package/dist/src/databases/engines/mysql/connection.d.ts +14 -0
  248. package/dist/src/databases/engines/mysql/connection.d.ts.map +1 -0
  249. package/dist/src/databases/engines/mysql/format.d.ts +5 -0
  250. package/dist/src/databases/engines/mysql/format.d.ts.map +1 -0
  251. package/dist/src/databases/engines/mysql/getStructure.d.ts +48 -0
  252. package/dist/src/databases/engines/mysql/getStructure.d.ts.map +1 -0
  253. package/dist/src/databases/engines/mysql/getViews.d.ts +7 -0
  254. package/dist/src/databases/engines/mysql/getViews.d.ts.map +1 -0
  255. package/dist/src/databases/engines/mysql/query/index.d.ts +7 -0
  256. package/dist/src/databases/engines/mysql/query/index.d.ts.map +1 -0
  257. package/dist/src/databases/engines/mysql/query/index.test.d.ts +2 -0
  258. package/dist/src/databases/engines/mysql/query/index.test.d.ts.map +1 -0
  259. package/dist/src/databases/engines/postgresql/auth.d.ts +9 -0
  260. package/dist/src/databases/engines/postgresql/auth.d.ts.map +1 -0
  261. package/dist/src/databases/engines/postgresql/auth.test.d.ts +2 -0
  262. package/dist/src/databases/engines/postgresql/auth.test.d.ts.map +1 -0
  263. package/dist/src/databases/engines/postgresql/connection.d.ts +14 -0
  264. package/dist/src/databases/engines/postgresql/connection.d.ts.map +1 -0
  265. package/dist/src/databases/engines/postgresql/format.d.ts +5 -0
  266. package/dist/src/databases/engines/postgresql/format.d.ts.map +1 -0
  267. package/dist/src/databases/engines/postgresql/getStructure.d.ts +48 -0
  268. package/dist/src/databases/engines/postgresql/getStructure.d.ts.map +1 -0
  269. package/dist/src/databases/engines/postgresql/getViews.d.ts +7 -0
  270. package/dist/src/databases/engines/postgresql/getViews.d.ts.map +1 -0
  271. package/dist/src/databases/engines/postgresql/query/index.d.ts +7 -0
  272. package/dist/src/databases/engines/postgresql/query/index.d.ts.map +1 -0
  273. package/dist/src/databases/engines/postgresql/query/index.test.d.ts +2 -0
  274. package/dist/src/databases/engines/postgresql/query/index.test.d.ts.map +1 -0
  275. package/dist/src/databases/engines/shared/claims.d.ts +2 -0
  276. package/dist/src/databases/engines/shared/claims.d.ts.map +1 -0
  277. package/dist/src/databases/engines/shared/types.d.ts +8 -0
  278. package/dist/src/databases/engines/shared/types.d.ts.map +1 -0
  279. package/dist/src/databases/high-level-operations.d.ts +146 -0
  280. package/dist/src/databases/high-level-operations.d.ts.map +1 -0
  281. package/dist/src/databases/high-level-operations.test.d.ts +2 -0
  282. package/dist/src/databases/high-level-operations.test.d.ts.map +1 -0
  283. package/dist/src/databases/index.d.ts +8 -0
  284. package/dist/src/databases/index.d.ts.map +1 -0
  285. package/dist/src/databases/metadata/structure.d.ts +56 -0
  286. package/dist/src/databases/metadata/structure.d.ts.map +1 -0
  287. package/dist/src/databases/schemaBuilder/convert.d.ts +2 -0
  288. package/dist/src/databases/schemaBuilder/convert.d.ts.map +1 -0
  289. package/dist/src/databases/schemaBuilder/generateCreateTable/index.d.ts +15 -0
  290. package/dist/src/databases/schemaBuilder/generateCreateTable/index.d.ts.map +1 -0
  291. package/dist/src/databases/schemaBuilder/generateCreateTable/index.test.d.ts +2 -0
  292. package/dist/src/databases/schemaBuilder/generateCreateTable/index.test.d.ts.map +1 -0
  293. package/dist/src/databases/schemaBuilder/generateCreateView/index.d.ts +18 -0
  294. package/dist/src/databases/schemaBuilder/generateCreateView/index.d.ts.map +1 -0
  295. package/dist/src/databases/schemaBuilder/generateInsert/index.d.ts +8 -0
  296. package/dist/src/databases/schemaBuilder/generateInsert/index.d.ts.map +1 -0
  297. package/dist/src/databases/schemaBuilder/generateInsert/index.test.d.ts +2 -0
  298. package/dist/src/databases/schemaBuilder/generateInsert/index.test.d.ts.map +1 -0
  299. package/dist/src/databases/schemaBuilder/generateSchemaCreation/index.d.ts +7 -0
  300. package/dist/src/databases/schemaBuilder/generateSchemaCreation/index.d.ts.map +1 -0
  301. package/dist/src/databases/schemaBuilder/generateSchemaCreation/index.test.d.ts +2 -0
  302. package/dist/src/databases/schemaBuilder/generateSchemaCreation/index.test.d.ts.map +1 -0
  303. package/dist/src/databases/schemaBuilder/mssqlToPostgres/convertView.d.ts +2 -0
  304. package/dist/src/databases/schemaBuilder/mssqlToPostgres/convertView.d.ts.map +1 -0
  305. package/dist/src/databases/schemaBuilder/utils.d.ts +8 -0
  306. package/dist/src/databases/schemaBuilder/utils.d.ts.map +1 -0
  307. package/dist/src/databases/sqlTypeUtils.d.ts +24 -0
  308. package/dist/src/databases/sqlTypeUtils.d.ts.map +1 -0
  309. package/dist/src/databases/sqlTypeUtils.test.d.ts +2 -0
  310. package/dist/src/databases/sqlTypeUtils.test.d.ts.map +1 -0
  311. package/dist/src/databases/transformers/data-transformers.d.ts +215 -0
  312. package/dist/src/databases/transformers/data-transformers.d.ts.map +1 -0
  313. package/dist/src/databases/transformers/data-transformers.test.d.ts +2 -0
  314. package/dist/src/databases/transformers/data-transformers.test.d.ts.map +1 -0
  315. package/dist/src/databases/transformers/genResolverName.d.ts +2 -0
  316. package/dist/src/databases/transformers/genResolverName.d.ts.map +1 -0
  317. package/dist/src/databases/transformers/genResolverName.test.d.ts +2 -0
  318. package/dist/src/databases/transformers/genResolverName.test.d.ts.map +1 -0
  319. package/dist/src/index.d.ts +139 -0
  320. package/dist/src/index.d.ts.map +1 -0
  321. package/dist/src/logging/index.d.ts +21 -0
  322. package/dist/src/logging/index.d.ts.map +1 -0
  323. package/dist/src/queues/kafka.d.ts +22 -0
  324. package/dist/src/queues/kafka.d.ts.map +1 -0
  325. package/dist/src/queues/rabbitmq.d.ts +34 -0
  326. package/dist/src/queues/rabbitmq.d.ts.map +1 -0
  327. package/dist/src/queues/rabbitmq.test.d.ts +2 -0
  328. package/dist/src/queues/rabbitmq.test.d.ts.map +1 -0
  329. package/dist/src/remoteREST/index.d.ts +13 -0
  330. package/dist/src/remoteREST/index.d.ts.map +1 -0
  331. package/dist/src/remoteREST/parse.d.ts +8 -0
  332. package/dist/src/remoteREST/parse.d.ts.map +1 -0
  333. package/dist/src/remoteREST/parse.test.d.ts +2 -0
  334. package/dist/src/remoteREST/parse.test.d.ts.map +1 -0
  335. package/dist/src/remoteREST/proxy.d.ts +6 -0
  336. package/dist/src/remoteREST/proxy.d.ts.map +1 -0
  337. package/dist/src/remoteREST/proxy.test.d.ts +2 -0
  338. package/dist/src/remoteREST/proxy.test.d.ts.map +1 -0
  339. package/dist/src/remoteREST/transform.d.ts +8 -0
  340. package/dist/src/remoteREST/transform.d.ts.map +1 -0
  341. package/dist/src/remoteREST/transform.test.d.ts +2 -0
  342. package/dist/src/remoteREST/transform.test.d.ts.map +1 -0
  343. package/dist/src/remoteREST/types.d.ts +37 -0
  344. package/dist/src/remoteREST/types.d.ts.map +1 -0
  345. package/dist/src/remoteSchemas/index.d.ts +13 -0
  346. package/dist/src/remoteSchemas/index.d.ts.map +1 -0
  347. package/dist/src/remoteSchemas/introspect.d.ts +7 -0
  348. package/dist/src/remoteSchemas/introspect.d.ts.map +1 -0
  349. package/dist/src/remoteSchemas/introspect.test.d.ts +2 -0
  350. package/dist/src/remoteSchemas/introspect.test.d.ts.map +1 -0
  351. package/dist/src/remoteSchemas/proxy.d.ts +7 -0
  352. package/dist/src/remoteSchemas/proxy.d.ts.map +1 -0
  353. package/dist/src/remoteSchemas/proxy.test.d.ts +2 -0
  354. package/dist/src/remoteSchemas/proxy.test.d.ts.map +1 -0
  355. package/dist/src/remoteSchemas/transform.d.ts +9 -0
  356. package/dist/src/remoteSchemas/transform.d.ts.map +1 -0
  357. package/dist/src/remoteSchemas/transform.test.d.ts +2 -0
  358. package/dist/src/remoteSchemas/transform.test.d.ts.map +1 -0
  359. package/dist/src/remoteSchemas/types.d.ts +41 -0
  360. package/dist/src/remoteSchemas/types.d.ts.map +1 -0
  361. package/dist/src/singletons/ai.d.ts +25 -0
  362. package/dist/src/singletons/ai.d.ts.map +1 -0
  363. package/dist/src/singletons/ai.test.d.ts +2 -0
  364. package/dist/src/singletons/ai.test.d.ts.map +1 -0
  365. package/dist/src/singletons/authentication.d.ts +4 -0
  366. package/dist/src/singletons/authentication.d.ts.map +1 -0
  367. package/dist/src/singletons/cache/index.d.ts +5 -0
  368. package/dist/src/singletons/cache/index.d.ts.map +1 -0
  369. package/dist/src/singletons/cache/lruCacheStore.d.ts +12 -0
  370. package/dist/src/singletons/cache/lruCacheStore.d.ts.map +1 -0
  371. package/dist/src/singletons/cache/lruCacheStore.test.d.ts +2 -0
  372. package/dist/src/singletons/cache/lruCacheStore.test.d.ts.map +1 -0
  373. package/dist/src/singletons/cache/redisCacheStore.d.ts +16 -0
  374. package/dist/src/singletons/cache/redisCacheStore.d.ts.map +1 -0
  375. package/dist/src/singletons/cache/redisClient.d.ts +3 -0
  376. package/dist/src/singletons/cache/redisClient.d.ts.map +1 -0
  377. package/dist/src/singletons/cache/registry.d.ts +7 -0
  378. package/dist/src/singletons/cache/registry.d.ts.map +1 -0
  379. package/dist/src/singletons/cache/registry.test.d.ts +2 -0
  380. package/dist/src/singletons/cache/registry.test.d.ts.map +1 -0
  381. package/dist/src/singletons/cache/types.d.ts +8 -0
  382. package/dist/src/singletons/cache/types.d.ts.map +1 -0
  383. package/dist/src/singletons/cron.d.ts +69 -0
  384. package/dist/src/singletons/cron.d.ts.map +1 -0
  385. package/dist/src/singletons/databases.d.ts +27 -0
  386. package/dist/src/singletons/databases.d.ts.map +1 -0
  387. package/dist/src/singletons/databases.test.d.ts +2 -0
  388. package/dist/src/singletons/databases.test.d.ts.map +1 -0
  389. package/dist/src/singletons/env.d.ts +494 -0
  390. package/dist/src/singletons/env.d.ts.map +1 -0
  391. package/dist/src/singletons/queues.d.ts +17 -0
  392. package/dist/src/singletons/queues.d.ts.map +1 -0
  393. package/dist/src/subscriptions/index.d.ts +4 -0
  394. package/dist/src/subscriptions/index.d.ts.map +1 -0
  395. package/dist/src/subscriptions/strategies/database.d.ts +12 -0
  396. package/dist/src/subscriptions/strategies/database.d.ts.map +1 -0
  397. package/dist/src/subscriptions/strategies/index.d.ts +12 -0
  398. package/dist/src/subscriptions/strategies/index.d.ts.map +1 -0
  399. package/dist/src/subscriptions/strategies/queue.d.ts +11 -0
  400. package/dist/src/subscriptions/strategies/queue.d.ts.map +1 -0
  401. package/dist/src/subscriptions/types.d.ts +67 -0
  402. package/dist/src/subscriptions/types.d.ts.map +1 -0
  403. package/dist/src/subscriptions/utils/polling.d.ts +17 -0
  404. package/dist/src/subscriptions/utils/polling.d.ts.map +1 -0
  405. package/dist/src/types/common.d.ts +44 -0
  406. package/dist/src/types/common.d.ts.map +1 -0
  407. package/dist/src/types/configuration.d.ts +28 -0
  408. package/dist/src/types/configuration.d.ts.map +1 -0
  409. package/dist/src/types/db.d.ts +43 -0
  410. package/dist/src/types/db.d.ts.map +1 -0
  411. package/dist/src/types/env.d.ts +2302 -0
  412. package/dist/src/types/env.d.ts.map +1 -0
  413. package/dist/src/types/env.test.d.ts +2 -0
  414. package/dist/src/types/env.test.d.ts.map +1 -0
  415. package/dist/src/types/resolver.d.ts +121 -0
  416. package/dist/src/types/resolver.d.ts.map +1 -0
  417. package/dist/src/types/zod/ai.d.ts +6 -0
  418. package/dist/src/types/zod/ai.d.ts.map +1 -0
  419. package/dist/src/types/zod/auth.d.ts +76 -0
  420. package/dist/src/types/zod/auth.d.ts.map +1 -0
  421. package/dist/src/types/zod/configuration.d.ts +1278 -0
  422. package/dist/src/types/zod/configuration.d.ts.map +1 -0
  423. package/dist/src/types/zod/configuration.test.d.ts +2 -0
  424. package/dist/src/types/zod/configuration.test.d.ts.map +1 -0
  425. package/dist/src/types/zod/cron.d.ts +32 -0
  426. package/dist/src/types/zod/cron.d.ts.map +1 -0
  427. package/dist/src/types/zod/db.d.ts +441 -0
  428. package/dist/src/types/zod/db.d.ts.map +1 -0
  429. package/dist/src/types/zod/db.test.d.ts +2 -0
  430. package/dist/src/types/zod/db.test.d.ts.map +1 -0
  431. package/dist/src/types/zod/mcp.d.ts +6 -0
  432. package/dist/src/types/zod/mcp.d.ts.map +1 -0
  433. package/dist/src/types/zod/operation.d.ts +9 -0
  434. package/dist/src/types/zod/operation.d.ts.map +1 -0
  435. package/dist/src/types/zod/queue.d.ts +656 -0
  436. package/dist/src/types/zod/queue.d.ts.map +1 -0
  437. package/dist/src/types/zod/queue.test.d.ts +2 -0
  438. package/dist/src/types/zod/queue.test.d.ts.map +1 -0
  439. package/dist/src/types/zod/remoteREST.d.ts +6 -0
  440. package/dist/src/types/zod/remoteREST.d.ts.map +1 -0
  441. package/dist/src/types/zod/remoteSchema.d.ts +6 -0
  442. package/dist/src/types/zod/remoteSchema.d.ts.map +1 -0
  443. package/dist/src/utils/benchmark.d.ts +2 -0
  444. package/dist/src/utils/benchmark.d.ts.map +1 -0
  445. package/dist/src/utils/event-emitter.d.ts +19 -0
  446. package/dist/src/utils/event-emitter.d.ts.map +1 -0
  447. package/dist/src/utils/responses.d.ts +19 -0
  448. package/dist/src/utils/responses.d.ts.map +1 -0
  449. package/dist/src/utils/responses.test.d.ts +2 -0
  450. package/dist/src/utils/responses.test.d.ts.map +1 -0
  451. package/dist/src/utils/safeJSONParse.d.ts +2 -0
  452. package/dist/src/utils/safeJSONParse.d.ts.map +1 -0
  453. package/dist/src/utils/selection.d.ts +3 -0
  454. package/dist/src/utils/selection.d.ts.map +1 -0
  455. package/dist/src/utils/selection.test.d.ts +2 -0
  456. package/dist/src/utils/selection.test.d.ts.map +1 -0
  457. package/dist/src/utils/sessionVariables.d.ts +47 -0
  458. package/dist/src/utils/sessionVariables.d.ts.map +1 -0
  459. package/dist/src/utils/sessionVariables.test.d.ts +2 -0
  460. package/dist/src/utils/sessionVariables.test.d.ts.map +1 -0
  461. package/dist/src/utils/writeSchema.d.ts +3 -0
  462. package/dist/src/utils/writeSchema.d.ts.map +1 -0
  463. package/dist/standalone.d.ts +3 -0
  464. package/dist/standalone.d.ts.map +1 -0
  465. package/dist/tsconfig.tsbuildinfo +1 -0
  466. package/package.json +119 -0
  467. package/playgrounds/console/index.html +25 -0
  468. package/playgrounds/graphiql/index.html +1144 -0
  469. package/playgrounds/scalar/index.html +19 -0
  470. package/src/ai/agent/agent.ts +222 -0
  471. package/src/ai/agent/index.ts +2 -0
  472. package/src/ai/agent/providers/anthropic.ts +113 -0
  473. package/src/ai/agent/providers/index.ts +62 -0
  474. package/src/ai/agent/providers/ollama.ts +128 -0
  475. package/src/ai/agent/providers/openai.ts +100 -0
  476. package/src/ai/agent/types.ts +65 -0
  477. package/src/ai/index.ts +8 -0
  478. package/src/ai/mcp/create-server.ts +444 -0
  479. package/src/ai/mcp/index.ts +80 -0
  480. package/src/ai/mcp/instructions.ts +103 -0
  481. package/src/ai/tools/agent.ts +111 -0
  482. package/src/ai/tools/core.ts +486 -0
  483. package/src/ai/tools/query-data.ts +109 -0
  484. package/src/analyzeQuery/analyzers/fragmentAnalyzer.ts +29 -0
  485. package/src/analyzeQuery/analyzers/operationAnalyzer.ts +50 -0
  486. package/src/analyzeQuery/analyzers/selectionAnalyzer.ts +135 -0
  487. package/src/analyzeQuery/analyzers/variableAnalyzer.ts +17 -0
  488. package/src/analyzeQuery/depthLimit.ts +124 -0
  489. package/src/analyzeQuery/directiveUtils.ts +99 -0
  490. package/src/analyzeQuery/index.ts +66 -0
  491. package/src/analyzeQuery/resolveVariables.ts +394 -0
  492. package/src/analyzeQuery/typeUtils.ts +47 -0
  493. package/src/analyzeQuery/types.ts +57 -0
  494. package/src/analyzeQuery/valueExtractors.ts +96 -0
  495. package/src/authentication/duration.ts +50 -0
  496. package/src/authentication/index.ts +34 -0
  497. package/src/authentication/jwt.ts +220 -0
  498. package/src/authentication/paseto.ts +256 -0
  499. package/src/authentication/tokenRepository.ts +75 -0
  500. package/src/authentication/types.ts +78 -0
  501. package/src/cli/seedAuth.ts +51 -0
  502. package/src/cli/seedAuthArgs.ts +50 -0
  503. package/src/config/helpers/cronHelper.ts +29 -0
  504. package/src/config/helpers/index.ts +8 -0
  505. package/src/config/helpers/operationHelper.ts +146 -0
  506. package/src/config/helpers/queueHelper.ts +27 -0
  507. package/src/config/index.ts +315 -0
  508. package/src/config/types/ai.ts +35 -0
  509. package/src/config/types/auth.ts +147 -0
  510. package/src/config/types/configuration.ts +69 -0
  511. package/src/config/types/cron.ts +140 -0
  512. package/src/config/types/db.ts +256 -0
  513. package/src/config/types/index.ts +129 -0
  514. package/src/config/types/operation.ts +253 -0
  515. package/src/config/types/queue.ts +172 -0
  516. package/src/config/types/remote-rest.ts +28 -0
  517. package/src/config/types/remote-schema.ts +39 -0
  518. package/src/config/types/virtual-columns.ts +157 -0
  519. package/src/configuration/getSchemas/index.ts +82 -0
  520. package/src/configuration/getSchemas/mergeEntities/index.ts +221 -0
  521. package/src/configuration/getSchemas/type-definition-generator/index.ts +511 -0
  522. package/src/configuration/gql/buildExecute.ts +54 -0
  523. package/src/configuration/gql/gqlAuthOperations.ts +150 -0
  524. package/src/configuration/gql/handleGraphQLRequestFactory.ts +415 -0
  525. package/src/configuration/gql/handleGraphQLSubscriptionFactory.ts +249 -0
  526. package/src/configuration/index.ts +138 -0
  527. package/src/configuration/rest/generateOpenAPI.ts +361 -0
  528. package/src/configuration/rest/handleRESTRequestFactory.ts +335 -0
  529. package/src/configuration/rest/index.ts +167 -0
  530. package/src/configuration/rest/openApiErrors.ts +106 -0
  531. package/src/console/api.ts +270 -0
  532. package/src/cron/index.ts +251 -0
  533. package/src/databases/auth/auth-operations.ts +36 -0
  534. package/src/databases/auth/password.ts +4 -0
  535. package/src/databases/common.ts +642 -0
  536. package/src/databases/core/executor.ts +97 -0
  537. package/src/databases/core/function-mapping.ts +176 -0
  538. package/src/databases/core/identifier.ts +8 -0
  539. package/src/databases/core/query-builder.ts +47 -0
  540. package/src/databases/directives.ts +112 -0
  541. package/src/databases/engines/mssql/auth.ts +112 -0
  542. package/src/databases/engines/mssql/connection.ts +151 -0
  543. package/src/databases/engines/mssql/format.ts +23 -0
  544. package/src/databases/engines/mssql/getStructure.ts +112 -0
  545. package/src/databases/engines/mssql/getViews.ts +17 -0
  546. package/src/databases/engines/mssql/query/index.ts +306 -0
  547. package/src/databases/engines/mysql/auth.ts +100 -0
  548. package/src/databases/engines/mysql/connection.ts +100 -0
  549. package/src/databases/engines/mysql/format.ts +23 -0
  550. package/src/databases/engines/mysql/getStructure.ts +116 -0
  551. package/src/databases/engines/mysql/getViews.ts +20 -0
  552. package/src/databases/engines/mysql/query/index.ts +291 -0
  553. package/src/databases/engines/postgresql/auth.ts +98 -0
  554. package/src/databases/engines/postgresql/connection.ts +99 -0
  555. package/src/databases/engines/postgresql/format.ts +23 -0
  556. package/src/databases/engines/postgresql/getStructure.ts +149 -0
  557. package/src/databases/engines/postgresql/getViews.ts +20 -0
  558. package/src/databases/engines/postgresql/query/index.ts +291 -0
  559. package/src/databases/engines/shared/claims.ts +26 -0
  560. package/src/databases/engines/shared/types.ts +7 -0
  561. package/src/databases/high-level-operations.ts +272 -0
  562. package/src/databases/index.ts +28 -0
  563. package/src/databases/metadata/structure.ts +12 -0
  564. package/src/databases/schemaBuilder/convert.ts +121 -0
  565. package/src/databases/schemaBuilder/generateCreateTable/index.ts +133 -0
  566. package/src/databases/schemaBuilder/generateCreateView/index.ts +101 -0
  567. package/src/databases/schemaBuilder/generateInsert/index.ts +47 -0
  568. package/src/databases/schemaBuilder/generateSchemaCreation/index.ts +29 -0
  569. package/src/databases/schemaBuilder/mssqlToPostgres/convertView.ts +47 -0
  570. package/src/databases/schemaBuilder/utils.ts +17 -0
  571. package/src/databases/sqlTypeUtils.ts +91 -0
  572. package/src/databases/transformers/data-transformers.ts +128 -0
  573. package/src/databases/transformers/genResolverName.ts +18 -0
  574. package/src/index.ts +461 -0
  575. package/src/logging/index.ts +69 -0
  576. package/src/queues/kafka.ts +409 -0
  577. package/src/queues/rabbitmq.ts +331 -0
  578. package/src/remoteREST/index.ts +46 -0
  579. package/src/remoteREST/parse.ts +68 -0
  580. package/src/remoteREST/proxy.ts +92 -0
  581. package/src/remoteREST/transform.ts +121 -0
  582. package/src/remoteREST/types.ts +38 -0
  583. package/src/remoteSchemas/index.ts +48 -0
  584. package/src/remoteSchemas/introspect.ts +44 -0
  585. package/src/remoteSchemas/proxy.ts +146 -0
  586. package/src/remoteSchemas/transform.ts +210 -0
  587. package/src/remoteSchemas/types.ts +43 -0
  588. package/src/singletons/ai.ts +91 -0
  589. package/src/singletons/authentication.ts +13 -0
  590. package/src/singletons/cache/index.ts +4 -0
  591. package/src/singletons/cache/lruCacheStore.ts +34 -0
  592. package/src/singletons/cache/redisCacheStore.ts +81 -0
  593. package/src/singletons/cache/redisClient.ts +12 -0
  594. package/src/singletons/cache/registry.ts +51 -0
  595. package/src/singletons/cache/types.ts +7 -0
  596. package/src/singletons/cron.ts +21 -0
  597. package/src/singletons/databases.ts +68 -0
  598. package/src/singletons/env.ts +3 -0
  599. package/src/singletons/queues.ts +101 -0
  600. package/src/subscriptions/index.ts +20 -0
  601. package/src/subscriptions/strategies/database.ts +68 -0
  602. package/src/subscriptions/strategies/index.ts +38 -0
  603. package/src/subscriptions/strategies/queue.ts +61 -0
  604. package/src/subscriptions/types.ts +74 -0
  605. package/src/subscriptions/utils/polling.ts +119 -0
  606. package/src/types/common.ts +57 -0
  607. package/src/types/configuration.ts +52 -0
  608. package/src/types/db.ts +87 -0
  609. package/src/types/env.ts +137 -0
  610. package/src/types/resolver.ts +181 -0
  611. package/src/types/zod/ai.ts +8 -0
  612. package/src/types/zod/auth.ts +96 -0
  613. package/src/types/zod/configuration.ts +46 -0
  614. package/src/types/zod/cron.ts +35 -0
  615. package/src/types/zod/db.ts +146 -0
  616. package/src/types/zod/mcp.ts +8 -0
  617. package/src/types/zod/operation.ts +37 -0
  618. package/src/types/zod/queue.ts +182 -0
  619. package/src/types/zod/remoteREST.ts +8 -0
  620. package/src/types/zod/remoteSchema.ts +11 -0
  621. package/src/utils/benchmark.ts +13 -0
  622. package/src/utils/event-emitter.ts +217 -0
  623. package/src/utils/responses.ts +42 -0
  624. package/src/utils/safeJSONParse.ts +10 -0
  625. package/src/utils/selection.ts +35 -0
  626. package/src/utils/sessionVariables.ts +131 -0
  627. package/src/utils/writeSchema.ts +13 -0
  628. package/standalone.ts +32 -0
@@ -0,0 +1,415 @@
1
+ import { isString } from "es-toolkit";
2
+ import { parse, specifiedRules, validate } from "graphql";
3
+ import { LRUCache } from "lru-cache";
4
+
5
+ import type { BunRequest } from "bun";
6
+ import type { DocumentNode, GraphQLError } from "graphql";
7
+ import type { AnalysisResult, SelectionAnalysis } from "../../analyzeQuery/types";
8
+ import type { GetGQLEntitiesReturn } from "../../configuration/getSchemas";
9
+ import type { MergedEntities } from "../../configuration/getSchemas/mergeEntities";
10
+ import type { Auth } from "../../types/configuration";
11
+ import type { SessionContext } from "../../utils/sessionVariables";
12
+
13
+ import { analyzeQuery } from "../../analyzeQuery";
14
+ import { depthLimitRule } from "../../analyzeQuery/depthLimit";
15
+ import { resolveVariableRef, resolveVariables } from "../../analyzeQuery/resolveVariables";
16
+ import { callStoredProcedure, executeQueryJSON, generateSQL } from "../../databases";
17
+ import { proxyRemoteField } from "../../remoteSchemas/proxy";
18
+ import { getAgent } from "../../singletons/ai";
19
+ import { databasesConnections, repositoryMap } from "../../singletons/databases";
20
+ import { env } from "../../singletons/env";
21
+ import { queueManager } from "../../singletons/queues";
22
+ import { EntitySource } from "../../types/resolver";
23
+ import { filterResultBySelection } from "../../utils/selection";
24
+ import { handleAuthMeQuery, handleAuthMutation } from "./gqlAuthOperations";
25
+ import { logger } from "../../logging";
26
+
27
+ // Handle GraphQL query
28
+ export const handleGraphQLRequestFactory = (
29
+ entities: MergedEntities,
30
+ gqlEntities: GetGQLEntitiesReturn,
31
+ auth: Auth | null = null,
32
+ ) => {
33
+ // Mutation handlers by source type
34
+ const mutationHandlers: Partial<
35
+ Record<
36
+ EntitySource,
37
+ (
38
+ field: SelectionAnalysis,
39
+ variables: Record<string, unknown>,
40
+ queryAnalysis: AnalysisResult,
41
+ req?: BunRequest,
42
+ session?: SessionContext,
43
+ ) => Promise<{ data: object }>
44
+ >
45
+ > = {
46
+ [EntitySource.QUEUE_PUBLISHER]: async (field, variables) => {
47
+ const data = resolveVariableRef(variables, field.arguments?.data);
48
+
49
+ const publisher = entities.queuesMap[field.name];
50
+
51
+ if (!publisher) {
52
+ throw new Error(`Queue publisher not found: ${field.name}`);
53
+ }
54
+
55
+ return {
56
+ data: {
57
+ [field.alias || field.name]: await queueManager?.sendMessage(
58
+ publisher.resolverName,
59
+ data?.toString() ?? "",
60
+ ),
61
+ },
62
+ };
63
+ },
64
+
65
+ [EntitySource.AUTH]: (field, variables, _queryAnalysis, req, session) =>
66
+ handleAuthMutation(field, variables, auth, req, session),
67
+
68
+ [EntitySource.OPERATION]: async (field, variables) => {
69
+ const operation = entities.operations[field.name];
70
+
71
+ if (!operation?.handler) {
72
+ throw new Error(`Operation handler not found for: ${field.name}`);
73
+ }
74
+
75
+ const argumentsReplaced = Object.fromEntries(
76
+ Object.entries(field.arguments?.input ?? {}).map(([key, value]) => [
77
+ key,
78
+ resolveVariableRef(variables, value),
79
+ ]),
80
+ );
81
+
82
+ const result = await operation.handler(
83
+ {
84
+ databases: databasesConnections,
85
+ gqlQuery: gql.handler,
86
+ queues: queueManager,
87
+ repository: repositoryMap,
88
+ },
89
+ argumentsReplaced,
90
+ );
91
+
92
+ // Filter result based on requested fields
93
+ const filteredResult = filterResultBySelection(result, field.selections);
94
+
95
+ return {
96
+ data: {
97
+ [field.alias || field.name]: filteredResult,
98
+ },
99
+ };
100
+ },
101
+
102
+ [EntitySource.STORED_PROCEDURE]: async (field, variables, queryAnalysis) => {
103
+ const sp = entities.mutationsMap[field.name];
104
+
105
+ if (!sp) {
106
+ throw new Error(`Stored procedure not found: ${field.name}`);
107
+ }
108
+
109
+ const argumentsReplaced = Object.fromEntries(
110
+ Object.entries(field.arguments ?? {}).map(([key, value]) => [
111
+ key,
112
+ resolveVariableRef(variables, value),
113
+ ]),
114
+ );
115
+
116
+ const result = await callStoredProcedure(
117
+ sp,
118
+ queryAnalysis.operations[0].variables ?? [],
119
+ argumentsReplaced as Record<string, string | number | boolean | null>,
120
+ );
121
+
122
+ return {
123
+ data: {
124
+ [field.alias || field.name]: result,
125
+ },
126
+ };
127
+ },
128
+
129
+ [EntitySource.REMOTE_SCHEMA]: async (field, variables, _queryAnalysis, req) => {
130
+ const entry = entities.remoteMutationsMap[field.name];
131
+
132
+ if (!entry) {
133
+ throw new Error(`Remote schema mutation not found: ${field.name}`);
134
+ }
135
+
136
+ const result = await proxyRemoteField(
137
+ field,
138
+ entry.remoteSchema,
139
+ entry.originalFieldName,
140
+ variables,
141
+ "mutation",
142
+ req,
143
+ );
144
+
145
+ return {
146
+ data: {
147
+ [field.alias || field.name]: result,
148
+ },
149
+ };
150
+ },
151
+ };
152
+
153
+ // Per-role LRU cache: keyed on raw query string, one entry per query enriched in
154
+ // place as the pipeline progresses (parse → validate → analyze). Caching validation
155
+ // is safe because the schema and depth rule are fixed for the factory's lifetime;
156
+ // if hot schema-reload is ever added, this cache must be dropped on reload.
157
+ interface CachedQuery {
158
+ document: DocumentNode;
159
+ validationErrors?: readonly GraphQLError[];
160
+ analysis?: AnalysisResult;
161
+ }
162
+
163
+ const queryCache = new LRUCache<string, CachedQuery>({ max: 1000 });
164
+
165
+ // undefined = unparseable query (never cached)
166
+ const getCacheEntry = (query: string): CachedQuery | undefined => {
167
+ const hit = queryCache.get(query);
168
+ if (hit) return hit;
169
+ try {
170
+ const entry: CachedQuery = { document: parse(query) };
171
+ queryCache.set(query, entry);
172
+ return entry;
173
+ } catch {
174
+ return undefined;
175
+ }
176
+ };
177
+
178
+ const isIntrospectionAST = (document: DocumentNode): boolean =>
179
+ document.definitions.some(
180
+ (def) =>
181
+ def.kind === "OperationDefinition" &&
182
+ def.selectionSet.selections.some(
183
+ (sel) => sel.kind === "Field" && sel.name.value === "__schema",
184
+ ),
185
+ );
186
+
187
+ const isNoDataAST = (document: DocumentNode): boolean =>
188
+ document.definitions.some(
189
+ (def) =>
190
+ def.kind === "OperationDefinition" &&
191
+ def.selectionSet.selections.some(
192
+ (sel) => sel.kind === "Field" && sel.name.value === "_no_data",
193
+ ),
194
+ );
195
+
196
+ const gql = {
197
+ // Check if the query is an introspection query (AST-based, not substring)
198
+ isIntrospectionQuery: (query: string) => {
199
+ const entry = getCacheEntry(query);
200
+ return entry ? isIntrospectionAST(entry.document) : false;
201
+ },
202
+ // Check if the query is a _no_data query (AST-based, not substring)
203
+ isNoDataQuery: (query: string) => {
204
+ const entry = getCacheEntry(query);
205
+ return entry ? isNoDataAST(entry.document) : false;
206
+ },
207
+ // Return the introspection result for clients like GraphiQL or Apollo Client
208
+ introspectionResult: { data: gqlEntities.introspection },
209
+ noDataResult: { data: { _no_data: "No data available" } },
210
+ hasErrors: (query: string) => {
211
+ const entry = getCacheEntry(query);
212
+ // Unparseable queries aren't cached; let parse surface the syntax error
213
+ const document = entry?.document ?? parse(query);
214
+
215
+ let validationErrors = entry?.validationErrors;
216
+ if (!validationErrors) {
217
+ const rules =
218
+ env.maxQueryDepth > 0
219
+ ? [...specifiedRules, depthLimitRule(env.maxQueryDepth)]
220
+ : undefined; // undefined = use default specifiedRules
221
+
222
+ validationErrors = validate(gqlEntities.schema, document, rules);
223
+ if (entry) entry.validationErrors = validationErrors;
224
+ }
225
+
226
+ return {
227
+ hasErrors: validationErrors.length > 0,
228
+ validationErrors,
229
+ };
230
+ },
231
+ // Handle the GraphQL query
232
+ handler: async (
233
+ query: string | AnalysisResult,
234
+ variables: Record<string, unknown> = {},
235
+ req?: BunRequest,
236
+ session?: SessionContext,
237
+ // oxlint-disable-next-line typescript/no-explicit-any
238
+ ): Promise<{ data: any }> => {
239
+ const log = logger("graphql").child({ role: session?.role });
240
+ const startTime = Bun.nanoseconds();
241
+
242
+ // Reuse cached analysis on repeated identical queries
243
+ const entry = isString(query) ? getCacheEntry(query) : undefined;
244
+ let queryAnalysis: AnalysisResult;
245
+ if (entry?.analysis) {
246
+ queryAnalysis = entry.analysis;
247
+ } else {
248
+ queryAnalysis = isString(query) ? analyzeQuery(query, entities, gqlEntities.schema) : query;
249
+ if (entry) entry.analysis = queryAnalysis;
250
+ }
251
+
252
+ if (queryAnalysis.operations.length === 0) {
253
+ return { data: {} };
254
+ }
255
+
256
+ const operation = queryAnalysis.operations[0];
257
+ log.debug(
258
+ {
259
+ operation: operation.operation,
260
+ name: operation.name,
261
+ fieldCount: operation.fields?.length,
262
+ queryLength: isString(query) ? query.length : undefined,
263
+ },
264
+ "graphql request",
265
+ );
266
+
267
+ // Single pass: validate, flatten object vars, resolve field args + session vars
268
+ // Returns an immutable ResolvedOperation — original operation is not mutated
269
+ const resolved = resolveVariables(operation, variables, session);
270
+
271
+ if (operation.operation === "query") {
272
+ // Separate auth fields, remote schema fields, and table fields
273
+ const authFields = resolved.fields.filter((field) => field.source === EntitySource.AUTH);
274
+ const remoteFields = resolved.fields.filter(
275
+ (field) => field.source === EntitySource.REMOTE_SCHEMA,
276
+ );
277
+ const aiFields = resolved.fields.filter((field) => field.source === EntitySource.AI);
278
+ const tableFields = resolved.fields.filter(
279
+ (field) =>
280
+ field.source !== EntitySource.AUTH &&
281
+ field.source !== EntitySource.REMOTE_SCHEMA &&
282
+ field.source !== EntitySource.AI,
283
+ );
284
+
285
+ // Handle auth queries (e.g. auth_me)
286
+ let authData: Record<string, unknown> = {};
287
+ for (const field of authFields) {
288
+ Object.assign(authData, handleAuthMeQuery(field, session));
289
+ }
290
+
291
+ // Handle remote schema queries in parallel
292
+ let remoteData: Record<string, unknown> = {};
293
+ if (remoteFields.length > 0) {
294
+ const remoteResults = await Promise.all(
295
+ remoteFields.map(async (field) => {
296
+ const entry = entities.remoteQueriesMap[field.name];
297
+ if (!entry) {
298
+ throw new Error(`Remote schema query not found: ${field.name}`);
299
+ }
300
+ const result = await proxyRemoteField(
301
+ field,
302
+ entry.remoteSchema,
303
+ entry.originalFieldName,
304
+ resolved.allVariables,
305
+ "query",
306
+ req,
307
+ );
308
+ return { [field.alias || field.name]: result };
309
+ }),
310
+ );
311
+ remoteData = remoteResults.reduce((acc, curr) => Object.assign(acc, curr), {});
312
+ }
313
+
314
+ // Handle AI agent queries (admin-only `ask` field)
315
+ let aiData: Record<string, unknown> = {};
316
+ for (const field of aiFields) {
317
+ const alias = field.alias || field.name;
318
+ const prompt = field.arguments?.prompt;
319
+ aiData[alias] = await getAgent()(String(prompt ?? ""));
320
+ }
321
+
322
+ // Skip SQL generation if there are no table fields
323
+ if (tableFields.length === 0) {
324
+ log.debug(
325
+ { durationMs: (Bun.nanoseconds() - startTime) / 1e6 },
326
+ "graphql request completed (no table fields)",
327
+ );
328
+ return { data: { ...authData, ...remoteData, ...aiData } };
329
+ }
330
+
331
+ const tableQueryAnalysis = {
332
+ ...queryAnalysis,
333
+ operations: [
334
+ {
335
+ ...operation,
336
+ fields: tableFields,
337
+ variables: resolved.variables,
338
+ },
339
+ ],
340
+ };
341
+
342
+ const sqlQueries = generateSQL(entities, tableQueryAnalysis, resolved.allVariables);
343
+
344
+ const data = await Promise.all<object>(
345
+ sqlQueries.map(([db, query]) =>
346
+ executeQueryJSON(
347
+ query,
348
+ db,
349
+ resolved.variables,
350
+ resolved.allVariables as Record<string, string | number | boolean | null>,
351
+ ),
352
+ ),
353
+ );
354
+
355
+ log.debug(
356
+ { durationMs: (Bun.nanoseconds() - startTime) / 1e6, dbCount: sqlQueries.length },
357
+ "graphql request completed",
358
+ );
359
+
360
+ return {
361
+ ...(env.queryOnResponse
362
+ ? {
363
+ sqlQueries: sqlQueries.map(([db, query]) => ({
364
+ db: db.name,
365
+ query,
366
+ })),
367
+ }
368
+ : {}),
369
+ data: data.reduce((acc, curr) => Object.assign(acc, curr), {
370
+ ...authData,
371
+ ...remoteData,
372
+ ...aiData,
373
+ }),
374
+ };
375
+ } else if (operation.operation === "mutation") {
376
+ // Route mutation to the appropriate handler based on field source
377
+ let results: Record<string, object> = {};
378
+
379
+ for await (const field of resolved.fields) {
380
+ const source = field.source;
381
+
382
+ if (source && mutationHandlers[source]) {
383
+ const result = await mutationHandlers[source]!(
384
+ field,
385
+ resolved.allVariables,
386
+ queryAnalysis,
387
+ req,
388
+ session,
389
+ );
390
+
391
+ results = {
392
+ ...results,
393
+ ...result.data,
394
+ };
395
+ }
396
+ }
397
+
398
+ log.debug(
399
+ { durationMs: (Bun.nanoseconds() - startTime) / 1e6 },
400
+ "graphql request completed",
401
+ );
402
+
403
+ return {
404
+ data: results,
405
+ };
406
+ }
407
+
408
+ return { data: {} };
409
+ },
410
+ };
411
+
412
+ return gql;
413
+ };
414
+
415
+ export type HandleGraphQLRequest = ReturnType<typeof handleGraphQLRequestFactory>;
@@ -0,0 +1,249 @@
1
+ import type { ServerWebSocket, WebSocketHandler } from "bun";
2
+ import type { AnalyzedConfiguration } from "../../configuration";
3
+ import type { SubscriptionContext } from "../../subscriptions";
4
+ import type { SessionContext } from "../../utils/sessionVariables";
5
+
6
+ import { analyzeQuery } from "../../analyzeQuery";
7
+ import { resolveVariables } from "../../analyzeQuery/resolveVariables";
8
+ import { getTokenService } from "../../singletons/authentication";
9
+ import { createSubscriptionStrategyRegistry, getStrategyForSource } from "../../subscriptions";
10
+ import { createQueryEventEmitter } from "../../utils/event-emitter";
11
+ import { logger } from "../../logging";
12
+
13
+ export const queryEventEmitter = createQueryEventEmitter();
14
+
15
+ // Create the strategy registry once at module load
16
+ const strategyRegistry = createSubscriptionStrategyRegistry();
17
+
18
+ /**
19
+ * Handle GraphQL subscription messages
20
+ *
21
+ * This factory creates a WebSocket message handler that:
22
+ * 1. Handles the graphql-ws protocol (connection_init, ping, subscribe, complete)
23
+ * 2. Delegates subscription logic to source-specific strategies
24
+ */
25
+ const handleGraphQLSubscriptionFactory = (
26
+ roles: AnalyzedConfiguration["roles"],
27
+ subscriptionMapping: Map<ServerWebSocket<unknown>, SessionContext>,
28
+ activeSubscriptions: Map<
29
+ string,
30
+ {
31
+ ws: ServerWebSocket<unknown>;
32
+ operationName: string;
33
+ cleanup?: () => void | Promise<void>;
34
+ }
35
+ >,
36
+ ) => {
37
+ return async (ws: ServerWebSocket<unknown>, body: string) => {
38
+ try {
39
+ const parsed = JSON.parse(body);
40
+ const { id, type, payload } = parsed;
41
+
42
+ // Validate message format
43
+ if (!type) {
44
+ ws.send(
45
+ JSON.stringify({
46
+ type: "connection_error",
47
+ payload: { message: "Message must have a 'type' field" },
48
+ }),
49
+ );
50
+ return;
51
+ }
52
+
53
+ // Handle connection_init
54
+ if (type === "connection_init") {
55
+ const session = await getTokenService().verifyTokenAndGetSession(
56
+ payload?.Authorization,
57
+ payload?.headers?.["x-admin-secret"],
58
+ );
59
+
60
+ subscriptionMapping.set(ws, session);
61
+
62
+ logger("subscriptions").debug({ role: session.role }, "client connected");
63
+
64
+ ws.send(
65
+ JSON.stringify({
66
+ type: "connection_ack",
67
+ }),
68
+ );
69
+ return;
70
+ }
71
+
72
+ // Handle ping
73
+ if (type === "ping") {
74
+ ws.send(
75
+ JSON.stringify({
76
+ type: "pong",
77
+ }),
78
+ );
79
+ return;
80
+ }
81
+
82
+ // Handle subscribe
83
+ if (type === "subscribe") {
84
+ if (!id) {
85
+ ws.send(
86
+ JSON.stringify({
87
+ type: "connection_error",
88
+ payload: { message: "Subscribe message must have an 'id' field" },
89
+ }),
90
+ );
91
+ return;
92
+ }
93
+
94
+ const { query, variables, operationName } = payload ?? {};
95
+ const session = subscriptionMapping.get(ws)!;
96
+ const schemaEntity = roles[session.role!];
97
+
98
+ // Validate query
99
+ const { hasErrors, validationErrors } = schemaEntity.handlers.gql.hasErrors(query);
100
+
101
+ if (hasErrors) {
102
+ queryEventEmitter.sendErrorToSingleClient(ws, id, validationErrors);
103
+ return;
104
+ }
105
+
106
+ // Analyze the query
107
+ const analysis = analyzeQuery(query, schemaEntity, schemaEntity.schema);
108
+
109
+ const operation = analysis.operations[0];
110
+ const field = operation.fields[0];
111
+
112
+ // Get the appropriate strategy based on field source
113
+ const strategy = getStrategyForSource(strategyRegistry, field?.source);
114
+
115
+ if (!strategy) {
116
+ ws.send(
117
+ JSON.stringify({
118
+ id,
119
+ type: "error",
120
+ payload: [
121
+ {
122
+ message: `Unsupported subscription source: ${field?.source}`,
123
+ },
124
+ ],
125
+ }),
126
+ );
127
+ return;
128
+ }
129
+
130
+ // Resolve variables: flatten object-type vars and replace $session.* references
131
+ let resolved;
132
+ try {
133
+ resolved = resolveVariables(operation, variables || {}, session);
134
+ } catch (error) {
135
+ ws.send(
136
+ JSON.stringify({
137
+ id,
138
+ type: "error",
139
+ payload: [
140
+ {
141
+ message: error instanceof Error ? error.message : "Variable resolution failed",
142
+ },
143
+ ],
144
+ }),
145
+ );
146
+ return;
147
+ }
148
+
149
+ // Build context for the strategy
150
+ const context: SubscriptionContext = {
151
+ ws,
152
+ subscriptionId: id,
153
+ analysis,
154
+ field: resolved.fields[0],
155
+ variableDefinitions: resolved.variables,
156
+ variables: resolved.allVariables,
157
+ schemaEntity,
158
+ eventEmitter: queryEventEmitter,
159
+ };
160
+
161
+ // Execute the strategy (handles connection registration internally)
162
+ const result = await strategy.subscribe(context);
163
+
164
+ // Store the subscription only if it's a new connection
165
+ if (!result.alreadyExists) {
166
+ logger("subscriptions").debug(
167
+ { operation: operationName || operation.name, subscriptionId: id },
168
+ "subscribed",
169
+ );
170
+ activeSubscriptions.set(id, {
171
+ ws,
172
+ operationName: operationName || operation.name!,
173
+ cleanup: result.cleanup,
174
+ });
175
+ }
176
+ }
177
+
178
+ // Handle complete
179
+ if (type === "complete") {
180
+ if (!id) {
181
+ ws.send(
182
+ JSON.stringify({
183
+ type: "connection_error",
184
+ payload: { message: "Complete message must have an 'id' field" },
185
+ }),
186
+ );
187
+ return;
188
+ }
189
+
190
+ const subscription = activeSubscriptions.get(id);
191
+ if (subscription) {
192
+ logger("subscriptions").debug({ subscriptionId: id }, "unsubscribed");
193
+ // Call cleanup if available
194
+ if (subscription.cleanup) {
195
+ await subscription.cleanup();
196
+ }
197
+ activeSubscriptions.delete(id);
198
+ }
199
+ queryEventEmitter.removeSubscription(ws, id);
200
+ }
201
+ } catch (error) {
202
+ if (error instanceof SyntaxError) {
203
+ logger("subscriptions").warn({ err: error }, "syntax error in subscription message");
204
+ } else {
205
+ logger("subscriptions").error({ err: error }, "subscription handler error");
206
+ }
207
+
208
+ throw error;
209
+ }
210
+ };
211
+ };
212
+
213
+ export const websocketHandlerFactory = (
214
+ roles: AnalyzedConfiguration["roles"],
215
+ ): WebSocketHandler<unknown> => {
216
+ const subscriptionMapping: Map<ServerWebSocket<unknown>, SessionContext> = new Map();
217
+ const activeSubscriptions: Map<
218
+ string,
219
+ {
220
+ ws: ServerWebSocket<unknown>;
221
+ operationName: string;
222
+ cleanup?: () => void | Promise<void>;
223
+ }
224
+ > = new Map();
225
+
226
+ const handleGraphQLSubscription = handleGraphQLSubscriptionFactory(
227
+ roles,
228
+ subscriptionMapping,
229
+ activeSubscriptions,
230
+ );
231
+
232
+ return {
233
+ async message(ws, message) {
234
+ handleGraphQLSubscription(ws, message as string);
235
+ },
236
+ close(ws) {
237
+ logger("subscriptions").debug("client disconnected");
238
+ // Clean up all subscriptions for this WebSocket
239
+ for (const [subscriptionId, subscription] of activeSubscriptions.entries()) {
240
+ if (subscription.ws === ws) {
241
+ subscription.cleanup?.();
242
+ activeSubscriptions.delete(subscriptionId);
243
+ }
244
+ }
245
+ queryEventEmitter.removeConnection(ws);
246
+ subscriptionMapping.delete(ws);
247
+ },
248
+ };
249
+ };