@digital-science-dsl/dimensions-analytics-mcp 0.5.3

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 (722) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +152 -0
  3. package/bin/dimensions-analytics-mcp-http.js +2 -0
  4. package/bin/dimensions-analytics-mcp.js +2 -0
  5. package/dist/client/auth/config-loaders.d.ts +22 -0
  6. package/dist/client/auth/config-loaders.d.ts.map +1 -0
  7. package/dist/client/auth/config-loaders.js +68 -0
  8. package/dist/client/auth/config-loaders.js.map +1 -0
  9. package/dist/client/auth/decorators/index.d.ts +7 -0
  10. package/dist/client/auth/decorators/index.d.ts.map +1 -0
  11. package/dist/client/auth/decorators/index.js +6 -0
  12. package/dist/client/auth/decorators/index.js.map +1 -0
  13. package/dist/client/auth/decorators/with-caching.d.ts +81 -0
  14. package/dist/client/auth/decorators/with-caching.d.ts.map +1 -0
  15. package/dist/client/auth/decorators/with-caching.js +168 -0
  16. package/dist/client/auth/decorators/with-caching.js.map +1 -0
  17. package/dist/client/auth/factory.d.ts +13 -0
  18. package/dist/client/auth/factory.d.ts.map +1 -0
  19. package/dist/client/auth/factory.js +29 -0
  20. package/dist/client/auth/factory.js.map +1 -0
  21. package/dist/client/auth/index.d.ts +7 -0
  22. package/dist/client/auth/index.d.ts.map +1 -0
  23. package/dist/client/auth/index.js +6 -0
  24. package/dist/client/auth/index.js.map +1 -0
  25. package/dist/client/auth/jwt-utils.d.ts +17 -0
  26. package/dist/client/auth/jwt-utils.d.ts.map +1 -0
  27. package/dist/client/auth/jwt-utils.js +33 -0
  28. package/dist/client/auth/jwt-utils.js.map +1 -0
  29. package/dist/client/auth/node.d.ts +16 -0
  30. package/dist/client/auth/node.d.ts.map +1 -0
  31. package/dist/client/auth/node.js +15 -0
  32. package/dist/client/auth/node.js.map +1 -0
  33. package/dist/client/auth/providers/index.d.ts +2 -0
  34. package/dist/client/auth/providers/index.d.ts.map +1 -0
  35. package/dist/client/auth/providers/index.js +2 -0
  36. package/dist/client/auth/providers/index.js.map +1 -0
  37. package/dist/client/auth/providers/jwt-auth-provider.d.ts +70 -0
  38. package/dist/client/auth/providers/jwt-auth-provider.d.ts.map +1 -0
  39. package/dist/client/auth/providers/jwt-auth-provider.js +134 -0
  40. package/dist/client/auth/providers/jwt-auth-provider.js.map +1 -0
  41. package/dist/client/auth/schemas.d.ts +19 -0
  42. package/dist/client/auth/schemas.d.ts.map +1 -0
  43. package/dist/client/auth/schemas.js +23 -0
  44. package/dist/client/auth/schemas.js.map +1 -0
  45. package/dist/client/auth/types.d.ts +25 -0
  46. package/dist/client/auth/types.d.ts.map +1 -0
  47. package/dist/client/auth/types.js +9 -0
  48. package/dist/client/auth/types.js.map +1 -0
  49. package/dist/client/command.d.ts +44 -0
  50. package/dist/client/command.d.ts.map +1 -0
  51. package/dist/client/command.js +23 -0
  52. package/dist/client/command.js.map +1 -0
  53. package/dist/client/config/index.d.ts +11 -0
  54. package/dist/client/config/index.d.ts.map +1 -0
  55. package/dist/client/config/index.js +8 -0
  56. package/dist/client/config/index.js.map +1 -0
  57. package/dist/client/config/loader.d.ts +27 -0
  58. package/dist/client/config/loader.d.ts.map +1 -0
  59. package/dist/client/config/loader.js +128 -0
  60. package/dist/client/config/loader.js.map +1 -0
  61. package/dist/client/config/node.d.ts +18 -0
  62. package/dist/client/config/node.d.ts.map +1 -0
  63. package/dist/client/config/node.js +17 -0
  64. package/dist/client/config/node.js.map +1 -0
  65. package/dist/client/config/schemas.d.ts +23 -0
  66. package/dist/client/config/schemas.d.ts.map +1 -0
  67. package/dist/client/config/schemas.js +24 -0
  68. package/dist/client/config/schemas.js.map +1 -0
  69. package/dist/client/config/types.d.ts +37 -0
  70. package/dist/client/config/types.d.ts.map +1 -0
  71. package/dist/client/config/types.js +6 -0
  72. package/dist/client/config/types.js.map +1 -0
  73. package/dist/client/config/unified-loader.d.ts +41 -0
  74. package/dist/client/config/unified-loader.d.ts.map +1 -0
  75. package/dist/client/config/unified-loader.js +86 -0
  76. package/dist/client/config/unified-loader.js.map +1 -0
  77. package/dist/client/config.d.ts +43 -0
  78. package/dist/client/config.d.ts.map +1 -0
  79. package/dist/client/config.js +56 -0
  80. package/dist/client/config.js.map +1 -0
  81. package/dist/client/deployment-config.d.ts +36 -0
  82. package/dist/client/deployment-config.d.ts.map +1 -0
  83. package/dist/client/deployment-config.js +79 -0
  84. package/dist/client/deployment-config.js.map +1 -0
  85. package/dist/client/errors.d.ts +180 -0
  86. package/dist/client/errors.d.ts.map +1 -0
  87. package/dist/client/errors.js +253 -0
  88. package/dist/client/errors.js.map +1 -0
  89. package/dist/client/http-client.d.ts +215 -0
  90. package/dist/client/http-client.d.ts.map +1 -0
  91. package/dist/client/http-client.js +419 -0
  92. package/dist/client/http-client.js.map +1 -0
  93. package/dist/client/index.d.ts +28 -0
  94. package/dist/client/index.d.ts.map +1 -0
  95. package/dist/client/index.js +18 -0
  96. package/dist/client/index.js.map +1 -0
  97. package/dist/client/internal-dsl-client.d.ts +30 -0
  98. package/dist/client/internal-dsl-client.d.ts.map +1 -0
  99. package/dist/client/internal-dsl-client.js +101 -0
  100. package/dist/client/internal-dsl-client.js.map +1 -0
  101. package/dist/client/rate-limiter.d.ts +79 -0
  102. package/dist/client/rate-limiter.d.ts.map +1 -0
  103. package/dist/client/rate-limiter.js +118 -0
  104. package/dist/client/rate-limiter.js.map +1 -0
  105. package/dist/client/resolve-api-key-user.d.ts +24 -0
  106. package/dist/client/resolve-api-key-user.d.ts.map +1 -0
  107. package/dist/client/resolve-api-key-user.js +80 -0
  108. package/dist/client/resolve-api-key-user.js.map +1 -0
  109. package/dist/client/types.d.ts +44 -0
  110. package/dist/client/types.d.ts.map +1 -0
  111. package/dist/client/types.js +10 -0
  112. package/dist/client/types.js.map +1 -0
  113. package/dist/dsl/client.d.ts +330 -0
  114. package/dist/dsl/client.d.ts.map +1 -0
  115. package/dist/dsl/client.js +433 -0
  116. package/dist/dsl/client.js.map +1 -0
  117. package/dist/dsl/commands/apply-filters.d.ts +15 -0
  118. package/dist/dsl/commands/apply-filters.d.ts.map +1 -0
  119. package/dist/dsl/commands/apply-filters.js +29 -0
  120. package/dist/dsl/commands/apply-filters.js.map +1 -0
  121. package/dist/dsl/commands/facet/index.d.ts +6 -0
  122. package/dist/dsl/commands/facet/index.d.ts.map +1 -0
  123. package/dist/dsl/commands/facet/index.js +6 -0
  124. package/dist/dsl/commands/facet/index.js.map +1 -0
  125. package/dist/dsl/commands/facet/schemas.d.ts +71 -0
  126. package/dist/dsl/commands/facet/schemas.d.ts.map +1 -0
  127. package/dist/dsl/commands/facet/schemas.js +84 -0
  128. package/dist/dsl/commands/facet/schemas.js.map +1 -0
  129. package/dist/dsl/commands/functions/ClassifyCommand.d.ts +96 -0
  130. package/dist/dsl/commands/functions/ClassifyCommand.d.ts.map +1 -0
  131. package/dist/dsl/commands/functions/ClassifyCommand.js +95 -0
  132. package/dist/dsl/commands/functions/ClassifyCommand.js.map +1 -0
  133. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts +86 -0
  134. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts.map +1 -0
  135. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js +131 -0
  136. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js.map +1 -0
  137. package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts +73 -0
  138. package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts.map +1 -0
  139. package/dist/dsl/commands/functions/ExtractConceptsCommand.js +110 -0
  140. package/dist/dsl/commands/functions/ExtractConceptsCommand.js.map +1 -0
  141. package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts +66 -0
  142. package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts.map +1 -0
  143. package/dist/dsl/commands/functions/ExtractGrantsCommand.js +87 -0
  144. package/dist/dsl/commands/functions/ExtractGrantsCommand.js.map +1 -0
  145. package/dist/dsl/commands/functions/index.d.ts +10 -0
  146. package/dist/dsl/commands/functions/index.d.ts.map +1 -0
  147. package/dist/dsl/commands/functions/index.js +10 -0
  148. package/dist/dsl/commands/functions/index.js.map +1 -0
  149. package/dist/dsl/commands/index.d.ts +8 -0
  150. package/dist/dsl/commands/index.d.ts.map +1 -0
  151. package/dist/dsl/commands/index.js +7 -0
  152. package/dist/dsl/commands/index.js.map +1 -0
  153. package/dist/dsl/commands/validate-input.d.ts +18 -0
  154. package/dist/dsl/commands/validate-input.d.ts.map +1 -0
  155. package/dist/dsl/commands/validate-input.js +27 -0
  156. package/dist/dsl/commands/validate-input.js.map +1 -0
  157. package/dist/dsl/create-client.d.ts +32 -0
  158. package/dist/dsl/create-client.d.ts.map +1 -0
  159. package/dist/dsl/create-client.js +58 -0
  160. package/dist/dsl/create-client.js.map +1 -0
  161. package/dist/dsl/fluent-query-builder.d.ts +439 -0
  162. package/dist/dsl/fluent-query-builder.d.ts.map +1 -0
  163. package/dist/dsl/fluent-query-builder.js +534 -0
  164. package/dist/dsl/fluent-query-builder.js.map +1 -0
  165. package/dist/dsl/index.d.ts +32 -0
  166. package/dist/dsl/index.d.ts.map +1 -0
  167. package/dist/dsl/index.js +31 -0
  168. package/dist/dsl/index.js.map +1 -0
  169. package/dist/dsl/pagination.d.ts +82 -0
  170. package/dist/dsl/pagination.d.ts.map +1 -0
  171. package/dist/dsl/pagination.js +135 -0
  172. package/dist/dsl/pagination.js.map +1 -0
  173. package/dist/dsl/query-builder.d.ts +456 -0
  174. package/dist/dsl/query-builder.d.ts.map +1 -0
  175. package/dist/dsl/query-builder.js +994 -0
  176. package/dist/dsl/query-builder.js.map +1 -0
  177. package/dist/dsl/response-parser.d.ts +111 -0
  178. package/dist/dsl/response-parser.d.ts.map +1 -0
  179. package/dist/dsl/response-parser.js +210 -0
  180. package/dist/dsl/response-parser.js.map +1 -0
  181. package/dist/dsl/schema/cache.d.ts +52 -0
  182. package/dist/dsl/schema/cache.d.ts.map +1 -0
  183. package/dist/dsl/schema/cache.js +97 -0
  184. package/dist/dsl/schema/cache.js.map +1 -0
  185. package/dist/dsl/schema/extract.d.ts +18 -0
  186. package/dist/dsl/schema/extract.d.ts.map +1 -0
  187. package/dist/dsl/schema/extract.js +41 -0
  188. package/dist/dsl/schema/extract.js.map +1 -0
  189. package/dist/dsl/schema/index.d.ts +13 -0
  190. package/dist/dsl/schema/index.d.ts.map +1 -0
  191. package/dist/dsl/schema/index.js +12 -0
  192. package/dist/dsl/schema/index.js.map +1 -0
  193. package/dist/dsl/schema/load.d.ts +41 -0
  194. package/dist/dsl/schema/load.d.ts.map +1 -0
  195. package/dist/dsl/schema/load.js +119 -0
  196. package/dist/dsl/schema/load.js.map +1 -0
  197. package/dist/dsl/schema/store.d.ts +137 -0
  198. package/dist/dsl/schema/store.d.ts.map +1 -0
  199. package/dist/dsl/schema/store.js +204 -0
  200. package/dist/dsl/schema/store.js.map +1 -0
  201. package/dist/dsl/schema/structured-entities.d.ts +21 -0
  202. package/dist/dsl/schema/structured-entities.d.ts.map +1 -0
  203. package/dist/dsl/schema/structured-entities.js +39 -0
  204. package/dist/dsl/schema/structured-entities.js.map +1 -0
  205. package/dist/dsl/schema/summary.d.ts +51 -0
  206. package/dist/dsl/schema/summary.d.ts.map +1 -0
  207. package/dist/dsl/schema/summary.js +61 -0
  208. package/dist/dsl/schema/summary.js.map +1 -0
  209. package/dist/dsl/schema/types.d.ts +36 -0
  210. package/dist/dsl/schema/types.d.ts.map +1 -0
  211. package/dist/dsl/schema/types.js +6 -0
  212. package/dist/dsl/schema/types.js.map +1 -0
  213. package/dist/dsl/schema/validation.d.ts +21 -0
  214. package/dist/dsl/schema/validation.d.ts.map +1 -0
  215. package/dist/dsl/schema/validation.js +44 -0
  216. package/dist/dsl/schema/validation.js.map +1 -0
  217. package/dist/dsl/types/buckets.d.ts +18 -0
  218. package/dist/dsl/types/buckets.d.ts.map +1 -0
  219. package/dist/dsl/types/buckets.js +6 -0
  220. package/dist/dsl/types/buckets.js.map +1 -0
  221. package/dist/dsl/types/common.d.ts +91 -0
  222. package/dist/dsl/types/common.d.ts.map +1 -0
  223. package/dist/dsl/types/common.js +6 -0
  224. package/dist/dsl/types/common.js.map +1 -0
  225. package/dist/dsl/types/entities.d.ts +35 -0
  226. package/dist/dsl/types/entities.d.ts.map +1 -0
  227. package/dist/dsl/types/entities.js +11 -0
  228. package/dist/dsl/types/entities.js.map +1 -0
  229. package/dist/dsl/types/index.d.ts +12 -0
  230. package/dist/dsl/types/index.d.ts.map +1 -0
  231. package/dist/dsl/types/index.js +7 -0
  232. package/dist/dsl/types/index.js.map +1 -0
  233. package/dist/dsl/types/return-clauses.d.ts +107 -0
  234. package/dist/dsl/types/return-clauses.d.ts.map +1 -0
  235. package/dist/dsl/types/return-clauses.js +22 -0
  236. package/dist/dsl/types/return-clauses.js.map +1 -0
  237. package/dist/dsl/types/special-functions.d.ts +175 -0
  238. package/dist/dsl/types/special-functions.d.ts.map +1 -0
  239. package/dist/dsl/types/special-functions.js +25 -0
  240. package/dist/dsl/types/special-functions.js.map +1 -0
  241. package/dist/dsl/types/vocabulary.d.ts +21 -0
  242. package/dist/dsl/types/vocabulary.d.ts.map +1 -0
  243. package/dist/dsl/types/vocabulary.js +44 -0
  244. package/dist/dsl/types/vocabulary.js.map +1 -0
  245. package/dist/dsl/usage-policy.d.ts +87 -0
  246. package/dist/dsl/usage-policy.d.ts.map +1 -0
  247. package/dist/dsl/usage-policy.js +133 -0
  248. package/dist/dsl/usage-policy.js.map +1 -0
  249. package/dist/dsl/utils/escape.d.ts +24 -0
  250. package/dist/dsl/utils/escape.d.ts.map +1 -0
  251. package/dist/dsl/utils/escape.js +124 -0
  252. package/dist/dsl/utils/escape.js.map +1 -0
  253. package/dist/dsl/utils/sanitize.d.ts +13 -0
  254. package/dist/dsl/utils/sanitize.d.ts.map +1 -0
  255. package/dist/dsl/utils/sanitize.js +19 -0
  256. package/dist/dsl/utils/sanitize.js.map +1 -0
  257. package/dist/dsl/utils/string-utils.d.ts +35 -0
  258. package/dist/dsl/utils/string-utils.d.ts.map +1 -0
  259. package/dist/dsl/utils/string-utils.js +145 -0
  260. package/dist/dsl/utils/string-utils.js.map +1 -0
  261. package/dist/dsl/utils/validate-field-name.d.ts +11 -0
  262. package/dist/dsl/utils/validate-field-name.d.ts.map +1 -0
  263. package/dist/dsl/utils/validate-field-name.js +18 -0
  264. package/dist/dsl/utils/validate-field-name.js.map +1 -0
  265. package/dist/examples/dsl-examples.d.ts +11 -0
  266. package/dist/examples/dsl-examples.d.ts.map +1 -0
  267. package/dist/examples/dsl-examples.js +49 -0
  268. package/dist/examples/dsl-examples.js.map +1 -0
  269. package/dist/examples/usage-scenarios.d.ts +22 -0
  270. package/dist/examples/usage-scenarios.d.ts.map +1 -0
  271. package/dist/examples/usage-scenarios.js +173 -0
  272. package/dist/examples/usage-scenarios.js.map +1 -0
  273. package/dist/funder-org-names.d.ts +12 -0
  274. package/dist/funder-org-names.d.ts.map +1 -0
  275. package/dist/funder-org-names.js +30 -0
  276. package/dist/funder-org-names.js.map +1 -0
  277. package/dist/http-main.d.ts +7 -0
  278. package/dist/http-main.d.ts.map +1 -0
  279. package/dist/http-main.js +36 -0
  280. package/dist/http-main.js.map +1 -0
  281. package/dist/http.d.ts +29 -0
  282. package/dist/http.d.ts.map +1 -0
  283. package/dist/http.js +173 -0
  284. package/dist/http.js.map +1 -0
  285. package/dist/index.d.ts +9 -0
  286. package/dist/index.d.ts.map +1 -0
  287. package/dist/index.js +7 -0
  288. package/dist/index.js.map +1 -0
  289. package/dist/kwq/build-query.d.ts +26 -0
  290. package/dist/kwq/build-query.d.ts.map +1 -0
  291. package/dist/kwq/build-query.js +37 -0
  292. package/dist/kwq/build-query.js.map +1 -0
  293. package/dist/kwq/concept-groups.d.ts +49 -0
  294. package/dist/kwq/concept-groups.d.ts.map +1 -0
  295. package/dist/kwq/concept-groups.js +55 -0
  296. package/dist/kwq/concept-groups.js.map +1 -0
  297. package/dist/kwq/dsl-assembler.d.ts +28 -0
  298. package/dist/kwq/dsl-assembler.d.ts.map +1 -0
  299. package/dist/kwq/dsl-assembler.js +124 -0
  300. package/dist/kwq/dsl-assembler.js.map +1 -0
  301. package/dist/kwq/ensemble.d.ts +38 -0
  302. package/dist/kwq/ensemble.d.ts.map +1 -0
  303. package/dist/kwq/ensemble.js +107 -0
  304. package/dist/kwq/ensemble.js.map +1 -0
  305. package/dist/kwq/index.d.ts +16 -0
  306. package/dist/kwq/index.d.ts.map +1 -0
  307. package/dist/kwq/index.js +14 -0
  308. package/dist/kwq/index.js.map +1 -0
  309. package/dist/kwq/types.d.ts +120 -0
  310. package/dist/kwq/types.d.ts.map +1 -0
  311. package/dist/kwq/types.js +11 -0
  312. package/dist/kwq/types.js.map +1 -0
  313. package/dist/lambda.d.ts +10 -0
  314. package/dist/lambda.d.ts.map +1 -0
  315. package/dist/lambda.js +4 -0
  316. package/dist/lambda.js.map +1 -0
  317. package/dist/main.d.ts +8 -0
  318. package/dist/main.d.ts.map +1 -0
  319. package/dist/main.js +33 -0
  320. package/dist/main.js.map +1 -0
  321. package/dist/mcp/batch-fetch.d.ts +89 -0
  322. package/dist/mcp/batch-fetch.d.ts.map +1 -0
  323. package/dist/mcp/batch-fetch.js +178 -0
  324. package/dist/mcp/batch-fetch.js.map +1 -0
  325. package/dist/mcp/examples/dsl-examples.d.ts +21 -0
  326. package/dist/mcp/examples/dsl-examples.d.ts.map +1 -0
  327. package/dist/mcp/examples/dsl-examples.js +61 -0
  328. package/dist/mcp/examples/dsl-examples.js.map +1 -0
  329. package/dist/mcp/examples/usage-scenarios.d.ts +20 -0
  330. package/dist/mcp/examples/usage-scenarios.d.ts.map +1 -0
  331. package/dist/mcp/examples/usage-scenarios.js +169 -0
  332. package/dist/mcp/examples/usage-scenarios.js.map +1 -0
  333. package/dist/mcp/export-format.d.ts +43 -0
  334. package/dist/mcp/export-format.d.ts.map +1 -0
  335. package/dist/mcp/export-format.js +92 -0
  336. package/dist/mcp/export-format.js.map +1 -0
  337. package/dist/mcp/funder-org-names.d.ts +12 -0
  338. package/dist/mcp/funder-org-names.d.ts.map +1 -0
  339. package/dist/mcp/funder-org-names.js +30 -0
  340. package/dist/mcp/funder-org-names.js.map +1 -0
  341. package/dist/mcp/http-server.d.ts +20 -0
  342. package/dist/mcp/http-server.d.ts.map +1 -0
  343. package/dist/mcp/http-server.js +118 -0
  344. package/dist/mcp/http-server.js.map +1 -0
  345. package/dist/mcp/middleware/field-aliases.d.ts +97 -0
  346. package/dist/mcp/middleware/field-aliases.d.ts.map +1 -0
  347. package/dist/mcp/middleware/field-aliases.js +208 -0
  348. package/dist/mcp/middleware/field-aliases.js.map +1 -0
  349. package/dist/mcp/resources/schema.d.ts +13 -0
  350. package/dist/mcp/resources/schema.d.ts.map +1 -0
  351. package/dist/mcp/resources/schema.js +262 -0
  352. package/dist/mcp/resources/schema.js.map +1 -0
  353. package/dist/mcp/schema/context.d.ts +10 -0
  354. package/dist/mcp/schema/context.d.ts.map +1 -0
  355. package/dist/mcp/schema/context.js +6 -0
  356. package/dist/mcp/schema/context.js.map +1 -0
  357. package/dist/mcp/schema/index.d.ts +8 -0
  358. package/dist/mcp/schema/index.d.ts.map +1 -0
  359. package/dist/mcp/schema/index.js +6 -0
  360. package/dist/mcp/schema/index.js.map +1 -0
  361. package/dist/mcp/server.d.ts +56 -0
  362. package/dist/mcp/server.d.ts.map +1 -0
  363. package/dist/mcp/server.js +168 -0
  364. package/dist/mcp/server.js.map +1 -0
  365. package/dist/mcp/shared-schema.d.ts +13 -0
  366. package/dist/mcp/shared-schema.d.ts.map +1 -0
  367. package/dist/mcp/shared-schema.js +28 -0
  368. package/dist/mcp/shared-schema.js.map +1 -0
  369. package/dist/mcp/tools/analytics-filters.d.ts +18 -0
  370. package/dist/mcp/tools/analytics-filters.d.ts.map +1 -0
  371. package/dist/mcp/tools/analytics-filters.js +35 -0
  372. package/dist/mcp/tools/analytics-filters.js.map +1 -0
  373. package/dist/mcp/tools/analytics.d.ts +16 -0
  374. package/dist/mcp/tools/analytics.d.ts.map +1 -0
  375. package/dist/mcp/tools/analytics.js +381 -0
  376. package/dist/mcp/tools/analytics.js.map +1 -0
  377. package/dist/mcp/tools/concept-profile.d.ts +14 -0
  378. package/dist/mcp/tools/concept-profile.d.ts.map +1 -0
  379. package/dist/mcp/tools/concept-profile.js +130 -0
  380. package/dist/mcp/tools/concept-profile.js.map +1 -0
  381. package/dist/mcp/tools/dataset-profile.d.ts +15 -0
  382. package/dist/mcp/tools/dataset-profile.d.ts.map +1 -0
  383. package/dist/mcp/tools/dataset-profile.js +194 -0
  384. package/dist/mcp/tools/dataset-profile.js.map +1 -0
  385. package/dist/mcp/tools/fetch-search-pages.d.ts +15 -0
  386. package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -0
  387. package/dist/mcp/tools/fetch-search-pages.js +237 -0
  388. package/dist/mcp/tools/fetch-search-pages.js.map +1 -0
  389. package/dist/mcp/tools/functions.d.ts +14 -0
  390. package/dist/mcp/tools/functions.d.ts.map +1 -0
  391. package/dist/mcp/tools/functions.js +87 -0
  392. package/dist/mcp/tools/functions.js.map +1 -0
  393. package/dist/mcp/tools/impact-chain.d.ts +15 -0
  394. package/dist/mcp/tools/impact-chain.d.ts.map +1 -0
  395. package/dist/mcp/tools/impact-chain.js +96 -0
  396. package/dist/mcp/tools/impact-chain.js.map +1 -0
  397. package/dist/mcp/tools/kwq.d.ts +19 -0
  398. package/dist/mcp/tools/kwq.d.ts.map +1 -0
  399. package/dist/mcp/tools/kwq.js +156 -0
  400. package/dist/mcp/tools/kwq.js.map +1 -0
  401. package/dist/mcp/tools/lookup.d.ts +14 -0
  402. package/dist/mcp/tools/lookup.d.ts.map +1 -0
  403. package/dist/mcp/tools/lookup.js +146 -0
  404. package/dist/mcp/tools/lookup.js.map +1 -0
  405. package/dist/mcp/tools/policy-profile.d.ts +15 -0
  406. package/dist/mcp/tools/policy-profile.d.ts.map +1 -0
  407. package/dist/mcp/tools/policy-profile.js +174 -0
  408. package/dist/mcp/tools/policy-profile.js.map +1 -0
  409. package/dist/mcp/tools/profile.d.ts +14 -0
  410. package/dist/mcp/tools/profile.d.ts.map +1 -0
  411. package/dist/mcp/tools/profile.js +349 -0
  412. package/dist/mcp/tools/profile.js.map +1 -0
  413. package/dist/mcp/tools/query.d.ts +16 -0
  414. package/dist/mcp/tools/query.d.ts.map +1 -0
  415. package/dist/mcp/tools/query.js +75 -0
  416. package/dist/mcp/tools/query.js.map +1 -0
  417. package/dist/mcp/tools/schema.d.ts +23 -0
  418. package/dist/mcp/tools/schema.d.ts.map +1 -0
  419. package/dist/mcp/tools/schema.js +124 -0
  420. package/dist/mcp/tools/schema.js.map +1 -0
  421. package/dist/mcp/tools/search-entity-metadata.d.ts +18 -0
  422. package/dist/mcp/tools/search-entity-metadata.d.ts.map +1 -0
  423. package/dist/mcp/tools/search-entity-metadata.js +221 -0
  424. package/dist/mcp/tools/search-entity-metadata.js.map +1 -0
  425. package/dist/mcp/tools/search-input.d.ts +58 -0
  426. package/dist/mcp/tools/search-input.d.ts.map +1 -0
  427. package/dist/mcp/tools/search-input.js +76 -0
  428. package/dist/mcp/tools/search-input.js.map +1 -0
  429. package/dist/mcp/tools/search.d.ts +24 -0
  430. package/dist/mcp/tools/search.d.ts.map +1 -0
  431. package/dist/mcp/tools/search.js +115 -0
  432. package/dist/mcp/tools/search.js.map +1 -0
  433. package/dist/mcp/utils.d.ts +82 -0
  434. package/dist/mcp/utils.d.ts.map +1 -0
  435. package/dist/mcp/utils.js +126 -0
  436. package/dist/mcp/utils.js.map +1 -0
  437. package/dist/middleware/field-aliases.d.ts +97 -0
  438. package/dist/middleware/field-aliases.d.ts.map +1 -0
  439. package/dist/middleware/field-aliases.js +208 -0
  440. package/dist/middleware/field-aliases.js.map +1 -0
  441. package/dist/resources/schema.d.ts +13 -0
  442. package/dist/resources/schema.d.ts.map +1 -0
  443. package/dist/resources/schema.js +204 -0
  444. package/dist/resources/schema.js.map +1 -0
  445. package/dist/schema/context.d.ts +10 -0
  446. package/dist/schema/context.d.ts.map +1 -0
  447. package/dist/schema/context.js +6 -0
  448. package/dist/schema/context.js.map +1 -0
  449. package/dist/schema/index.d.ts +9 -0
  450. package/dist/schema/index.d.ts.map +1 -0
  451. package/dist/schema/index.js +6 -0
  452. package/dist/schema/index.js.map +1 -0
  453. package/dist/schema/load.d.ts +43 -0
  454. package/dist/schema/load.d.ts.map +1 -0
  455. package/dist/schema/load.js +139 -0
  456. package/dist/schema/load.js.map +1 -0
  457. package/dist/schema/store.d.ts +112 -0
  458. package/dist/schema/store.d.ts.map +1 -0
  459. package/dist/schema/store.js +173 -0
  460. package/dist/schema/store.js.map +1 -0
  461. package/dist/schema/structured-entities.d.ts +21 -0
  462. package/dist/schema/structured-entities.d.ts.map +1 -0
  463. package/dist/schema/structured-entities.js +39 -0
  464. package/dist/schema/structured-entities.js.map +1 -0
  465. package/dist/schema/types.d.ts +36 -0
  466. package/dist/schema/types.d.ts.map +1 -0
  467. package/dist/schema/types.js +6 -0
  468. package/dist/schema/types.js.map +1 -0
  469. package/dist/server.d.ts +57 -0
  470. package/dist/server.d.ts.map +1 -0
  471. package/dist/server.js +144 -0
  472. package/dist/server.js.map +1 -0
  473. package/dist/telemetry.d.ts +172 -0
  474. package/dist/telemetry.d.ts.map +1 -0
  475. package/dist/telemetry.js +233 -0
  476. package/dist/telemetry.js.map +1 -0
  477. package/dist/tools/analytics-filters.d.ts +18 -0
  478. package/dist/tools/analytics-filters.d.ts.map +1 -0
  479. package/dist/tools/analytics-filters.js +35 -0
  480. package/dist/tools/analytics-filters.js.map +1 -0
  481. package/dist/tools/analytics.d.ts +16 -0
  482. package/dist/tools/analytics.d.ts.map +1 -0
  483. package/dist/tools/analytics.js +381 -0
  484. package/dist/tools/analytics.js.map +1 -0
  485. package/dist/tools/concept-profile.d.ts +14 -0
  486. package/dist/tools/concept-profile.d.ts.map +1 -0
  487. package/dist/tools/concept-profile.js +130 -0
  488. package/dist/tools/concept-profile.js.map +1 -0
  489. package/dist/tools/dataset-profile.d.ts +15 -0
  490. package/dist/tools/dataset-profile.d.ts.map +1 -0
  491. package/dist/tools/dataset-profile.js +194 -0
  492. package/dist/tools/dataset-profile.js.map +1 -0
  493. package/dist/tools/functions.d.ts +14 -0
  494. package/dist/tools/functions.d.ts.map +1 -0
  495. package/dist/tools/functions.js +294 -0
  496. package/dist/tools/functions.js.map +1 -0
  497. package/dist/tools/impact-chain.d.ts +15 -0
  498. package/dist/tools/impact-chain.d.ts.map +1 -0
  499. package/dist/tools/impact-chain.js +96 -0
  500. package/dist/tools/impact-chain.js.map +1 -0
  501. package/dist/tools/kwq.d.ts +19 -0
  502. package/dist/tools/kwq.d.ts.map +1 -0
  503. package/dist/tools/kwq.js +156 -0
  504. package/dist/tools/kwq.js.map +1 -0
  505. package/dist/tools/lookup.d.ts +14 -0
  506. package/dist/tools/lookup.d.ts.map +1 -0
  507. package/dist/tools/lookup.js +213 -0
  508. package/dist/tools/lookup.js.map +1 -0
  509. package/dist/tools/policy-profile.d.ts +15 -0
  510. package/dist/tools/policy-profile.d.ts.map +1 -0
  511. package/dist/tools/policy-profile.js +174 -0
  512. package/dist/tools/policy-profile.js.map +1 -0
  513. package/dist/tools/profile.d.ts +14 -0
  514. package/dist/tools/profile.d.ts.map +1 -0
  515. package/dist/tools/profile.js +349 -0
  516. package/dist/tools/profile.js.map +1 -0
  517. package/dist/tools/query.d.ts +16 -0
  518. package/dist/tools/query.d.ts.map +1 -0
  519. package/dist/tools/query.js +53 -0
  520. package/dist/tools/query.js.map +1 -0
  521. package/dist/tools/schema.d.ts +23 -0
  522. package/dist/tools/schema.d.ts.map +1 -0
  523. package/dist/tools/schema.js +124 -0
  524. package/dist/tools/schema.js.map +1 -0
  525. package/dist/tools/search-entity-metadata.d.ts +18 -0
  526. package/dist/tools/search-entity-metadata.d.ts.map +1 -0
  527. package/dist/tools/search-entity-metadata.js +221 -0
  528. package/dist/tools/search-entity-metadata.js.map +1 -0
  529. package/dist/tools/search.d.ts +23 -0
  530. package/dist/tools/search.d.ts.map +1 -0
  531. package/dist/tools/search.js +110 -0
  532. package/dist/tools/search.js.map +1 -0
  533. package/dist/tools/solr-fields.d.ts +39 -0
  534. package/dist/tools/solr-fields.d.ts.map +1 -0
  535. package/dist/tools/solr-fields.js +40 -0
  536. package/dist/tools/solr-fields.js.map +1 -0
  537. package/dist/utils.d.ts +70 -0
  538. package/dist/utils.d.ts.map +1 -0
  539. package/dist/utils.js +104 -0
  540. package/dist/utils.js.map +1 -0
  541. package/package.json +41 -0
  542. package/src/client/auth/config-loaders.ts +81 -0
  543. package/src/client/auth/decorators/index.ts +7 -0
  544. package/src/client/auth/decorators/with-caching.ts +237 -0
  545. package/src/client/auth/factory.ts +34 -0
  546. package/src/client/auth/index.ts +6 -0
  547. package/src/client/auth/jwt-utils.ts +36 -0
  548. package/src/client/auth/node.ts +16 -0
  549. package/src/client/auth/providers/index.ts +1 -0
  550. package/src/client/auth/providers/jwt-auth-provider.ts +153 -0
  551. package/src/client/auth/schemas.ts +25 -0
  552. package/src/client/auth/types.ts +30 -0
  553. package/src/client/command.ts +54 -0
  554. package/src/client/config/index.ts +15 -0
  555. package/src/client/config/loader.ts +155 -0
  556. package/src/client/config/node.ts +22 -0
  557. package/src/client/config/schemas.ts +28 -0
  558. package/src/client/config/types.ts +39 -0
  559. package/src/client/config/unified-loader.ts +118 -0
  560. package/src/client/config.ts +69 -0
  561. package/src/client/deployment-config.ts +98 -0
  562. package/src/client/errors.ts +295 -0
  563. package/src/client/http-client.ts +577 -0
  564. package/src/client/index.ts +68 -0
  565. package/src/client/internal-dsl-client.ts +128 -0
  566. package/src/client/rate-limiter.ts +139 -0
  567. package/src/client/resolve-api-key-user.ts +99 -0
  568. package/src/client/types.ts +44 -0
  569. package/src/dsl/client.ts +538 -0
  570. package/src/dsl/commands/apply-filters.ts +35 -0
  571. package/src/dsl/commands/facet/index.ts +12 -0
  572. package/src/dsl/commands/facet/schemas.ts +101 -0
  573. package/src/dsl/commands/functions/ClassifyCommand.ts +129 -0
  574. package/src/dsl/commands/functions/ExtractAffiliationsCommand.ts +163 -0
  575. package/src/dsl/commands/functions/ExtractConceptsCommand.ts +141 -0
  576. package/src/dsl/commands/functions/ExtractGrantsCommand.ts +112 -0
  577. package/src/dsl/commands/functions/index.ts +31 -0
  578. package/src/dsl/commands/index.ts +29 -0
  579. package/src/dsl/commands/validate-input.ts +29 -0
  580. package/src/dsl/create-client.ts +80 -0
  581. package/src/dsl/fluent-query-builder.ts +684 -0
  582. package/src/dsl/index.ts +206 -0
  583. package/src/dsl/pagination.ts +202 -0
  584. package/src/dsl/query-builder.ts +1120 -0
  585. package/src/dsl/response-parser.ts +299 -0
  586. package/src/dsl/schema/cache.ts +124 -0
  587. package/src/dsl/schema/extract.ts +44 -0
  588. package/src/dsl/schema/index.ts +50 -0
  589. package/src/dsl/schema/load.ts +160 -0
  590. package/src/dsl/schema/store.ts +253 -0
  591. package/src/dsl/schema/structured-entities.ts +44 -0
  592. package/src/dsl/schema/summary.ts +94 -0
  593. package/src/dsl/schema/types.ts +40 -0
  594. package/src/dsl/schema/validation.ts +56 -0
  595. package/src/dsl/types/buckets.ts +22 -0
  596. package/src/dsl/types/common.ts +99 -0
  597. package/src/dsl/types/entities.ts +43 -0
  598. package/src/dsl/types/index.ts +63 -0
  599. package/src/dsl/types/return-clauses.ts +147 -0
  600. package/src/dsl/types/special-functions.ts +220 -0
  601. package/src/dsl/types/vocabulary.ts +82 -0
  602. package/src/dsl/usage-policy.ts +219 -0
  603. package/src/dsl/utils/escape.ts +123 -0
  604. package/src/dsl/utils/sanitize.ts +21 -0
  605. package/src/dsl/utils/string-utils.ts +147 -0
  606. package/src/dsl/utils/validate-field-name.ts +19 -0
  607. package/src/http-main.ts +41 -0
  608. package/src/index.ts +14 -0
  609. package/src/main.ts +40 -0
  610. package/src/mcp/batch-fetch.ts +255 -0
  611. package/src/mcp/examples/dsl-examples.ts +66 -0
  612. package/src/mcp/examples/usage-scenarios.ts +185 -0
  613. package/src/mcp/export-format.ts +113 -0
  614. package/src/mcp/funder-org-names.ts +30 -0
  615. package/src/mcp/http-server.ts +148 -0
  616. package/src/mcp/middleware/field-aliases.ts +274 -0
  617. package/src/mcp/resources/schema.ts +364 -0
  618. package/src/mcp/schema/context.ts +11 -0
  619. package/src/mcp/schema/index.ts +38 -0
  620. package/src/mcp/server.ts +247 -0
  621. package/src/mcp/shared-schema.ts +34 -0
  622. package/src/mcp/tools/analytics-filters.ts +46 -0
  623. package/src/mcp/tools/analytics.ts +453 -0
  624. package/src/mcp/tools/fetch-search-pages.ts +329 -0
  625. package/src/mcp/tools/functions.ts +105 -0
  626. package/src/mcp/tools/lookup.ts +182 -0
  627. package/src/mcp/tools/query.ts +91 -0
  628. package/src/mcp/tools/schema.ts +147 -0
  629. package/src/mcp/tools/search-entity-metadata.ts +253 -0
  630. package/src/mcp/tools/search-input.ts +87 -0
  631. package/src/mcp/tools/search.ts +168 -0
  632. package/src/mcp/utils.ts +199 -0
  633. package/test/client/auth/config-loaders.test.ts +92 -0
  634. package/test/client/auth/decorators/with-caching.test.ts +482 -0
  635. package/test/client/auth/factory.test.ts +68 -0
  636. package/test/client/auth/providers/jwt-auth-provider.test.ts +398 -0
  637. package/test/client/auth/types.test.ts +18 -0
  638. package/test/client/command.test.ts +163 -0
  639. package/test/client/config/loader.test.ts +377 -0
  640. package/test/client/config/unified-loader.test.ts +136 -0
  641. package/test/client/deployment-config.test.ts +69 -0
  642. package/test/client/errors/index.test.ts +408 -0
  643. package/test/client/helpers/mock-fetch.ts +42 -0
  644. package/test/client/http-client.test.ts +1148 -0
  645. package/test/client/integration/auth-providers.integration.test.ts +186 -0
  646. package/test/client/internal-dsl-client.test.ts +76 -0
  647. package/test/client/rate-limiter.test.ts +204 -0
  648. package/test/client/resolve-api-key-user.test.ts +87 -0
  649. package/test/dsl/client.special-functions.test.ts +387 -0
  650. package/test/dsl/client.test.ts +457 -0
  651. package/test/dsl/commands/apply-filters.test.ts +147 -0
  652. package/test/dsl/commands/functions/ClassifyCommand.test.ts +170 -0
  653. package/test/dsl/commands/functions/ExtractAffiliationsCommand.test.ts +306 -0
  654. package/test/dsl/commands/functions/ExtractConceptsCommand.test.ts +136 -0
  655. package/test/dsl/commands/functions/ExtractGrantsCommand.test.ts +202 -0
  656. package/test/dsl/commands/search/filters.test.ts +42 -0
  657. package/test/dsl/fluent-query-builder.test.ts +865 -0
  658. package/test/dsl/integration/client.integration.test.ts +294 -0
  659. package/test/dsl/integration/facet-api.integration.test.ts +276 -0
  660. package/test/dsl/integration/field-existence.integration.test.ts +148 -0
  661. package/test/dsl/integration/fluent-api-docs-examples.integration.test.ts +988 -0
  662. package/test/dsl/integration/fluent-api.integration.test.ts +615 -0
  663. package/test/dsl/integration/search-helpers.ts +27 -0
  664. package/test/dsl/integration/special-functions.integration.test.ts +224 -0
  665. package/test/dsl/integration/test-config.ts +52 -0
  666. package/test/dsl/pagination.test.ts +86 -0
  667. package/test/dsl/query-builder.test.ts +1775 -0
  668. package/test/dsl/response-parser.test.ts +520 -0
  669. package/test/dsl/schema/cache.test.ts +53 -0
  670. package/test/dsl/schema/load.test.ts +165 -0
  671. package/test/dsl/schema/summary.test.ts +61 -0
  672. package/test/dsl/schema/validation.test.ts +46 -0
  673. package/test/dsl/time-series.test.ts +135 -0
  674. package/test/dsl/unnest.test.ts +151 -0
  675. package/test/dsl/usage-policy.test.ts +100 -0
  676. package/test/dsl/utils/escape.property.test.ts +109 -0
  677. package/test/dsl/utils/escape.test.ts +140 -0
  678. package/test/dsl/utils/validate-field-name.property.test.ts +99 -0
  679. package/test/dsl/utils/validate-field-name.test.ts +55 -0
  680. package/test/examples/dsl-examples.test.ts +29 -0
  681. package/test/examples/usage-scenarios.test.ts +90 -0
  682. package/test/fixtures/describe-schema.json +4000 -0
  683. package/test/funder-org-names.test.ts +20 -0
  684. package/test/helpers/schema-fixture.ts +18 -0
  685. package/test/helpers/tool-test-harness.ts +114 -0
  686. package/test/integration/assertions.ts +263 -0
  687. package/test/integration/env.ts +108 -0
  688. package/test/integration/harness.ts +307 -0
  689. package/test/integration/hosted-client.ts +56 -0
  690. package/test/integration/hosted-mocks.ts +81 -0
  691. package/test/integration/hosted-run.ts +86 -0
  692. package/test/integration/hosted.e2e.test.ts +101 -0
  693. package/test/integration/reporter.ts +100 -0
  694. package/test/integration/run.ts +74 -0
  695. package/test/integration/suites/analytics.integration.ts +72 -0
  696. package/test/integration/suites/functions.integration.ts +37 -0
  697. package/test/integration/suites/hosted-smoke.integration.ts +38 -0
  698. package/test/integration/suites/index.ts +22 -0
  699. package/test/integration/suites/lookup.integration.ts +57 -0
  700. package/test/integration/suites/query.integration.ts +49 -0
  701. package/test/integration/suites/resources.integration.ts +68 -0
  702. package/test/integration/suites/search.integration.ts +80 -0
  703. package/test/integration/types.ts +92 -0
  704. package/test/integration/verify-usage-scenarios.ts +162 -0
  705. package/test/mcp/export-format.test.ts +67 -0
  706. package/test/mcp/http-server.test.ts +80 -0
  707. package/test/middleware/field-aliases.test.ts +287 -0
  708. package/test/resources/schema.test.ts +28 -0
  709. package/test/schema/describe-contract.test.ts +24 -0
  710. package/test/schema/store.test.ts +45 -0
  711. package/test/server.test.ts +170 -0
  712. package/test/tools/analytics-filters.test.ts +35 -0
  713. package/test/tools/analytics.test.ts +419 -0
  714. package/test/tools/fetch-search-pages.test.ts +200 -0
  715. package/test/tools/functions.test.ts +153 -0
  716. package/test/tools/lookup.test.ts +296 -0
  717. package/test/tools/query.test.ts +100 -0
  718. package/test/tools/schema.test.ts +37 -0
  719. package/test/tools/search.test.ts +415 -0
  720. package/test/utils.test.ts +45 -0
  721. package/tsconfig.json +9 -0
  722. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,684 @@
1
+ /**
2
+ * Fluent query builder that wraps QueryBuilder with execute() capability.
3
+ * Provides a chainable API for building and executing Dimensions DSL queries.
4
+ * @module fluent-query-builder
5
+ */
6
+
7
+ import type { QueryExecutor } from "../client/index.js";
8
+ import { QueryBuilder } from "./query-builder.js";
9
+ import {
10
+ type FacetFieldConfig,
11
+ type FacetQueryResult,
12
+ type ParseFacetOptions,
13
+ parseEntityResponse,
14
+ parseFacetResponse,
15
+ type TypedFacetResult,
16
+ } from "./response-parser.js";
17
+ import type { SchemaStore } from "./schema/store.js";
18
+ import type { BaseBucket } from "./types/buckets.js";
19
+ import type {
20
+ ClinicalTrial,
21
+ Dataset,
22
+ Grant,
23
+ Organization,
24
+ Patent,
25
+ PolicyDocument,
26
+ Publication,
27
+ Researcher,
28
+ } from "./types/entities.js";
29
+ import type { Currency } from "./types/return-clauses.js";
30
+ import type { EntityType, SearchIndex, SortOrder, WhereOperator } from "./types/vocabulary.js";
31
+
32
+ /**
33
+ * Maps entity types to their corresponding TypeScript interfaces.
34
+ */
35
+ export type EntityTypeMap = {
36
+ publications: Publication;
37
+ grants: Grant;
38
+ researchers: Researcher;
39
+ patents: Patent;
40
+ clinical_trials: ClinicalTrial;
41
+ datasets: Dataset;
42
+ policy_documents: PolicyDocument;
43
+ organizations: Organization;
44
+ };
45
+
46
+ /**
47
+ * Result of executing a fluent query.
48
+ * @template T - The entity type
49
+ */
50
+ export interface FluentQueryResult<T> {
51
+ /** Array of matching entities */
52
+ readonly data: T[];
53
+ /** Total count of matching entities (may be larger than data.length if paginated) */
54
+ readonly totalCount: number;
55
+ }
56
+
57
+ /**
58
+ * Internal state for tracking facet configurations.
59
+ */
60
+ interface FacetConfig {
61
+ readonly field: string;
62
+ readonly indicators?: readonly string[];
63
+ readonly sortBy?: string;
64
+ readonly sortOrder?: SortOrder;
65
+ readonly limit?: number;
66
+ }
67
+
68
+ /** Facet results keyed by configured facet field name. */
69
+ type FacetResults<TFacets extends Record<string, FacetConfig>> = {
70
+ [K in keyof TFacets & string]: TypedFacetResult<BaseBucket>;
71
+ };
72
+
73
+ /**
74
+ * Abstract base class for fluent query builders.
75
+ * Contains all common query-building methods shared between FluentQueryBuilder
76
+ * and FluentQueryBuilderWithFacets.
77
+ *
78
+ * @template T - The entity type
79
+ * @template E - The entity type key
80
+ */
81
+ abstract class FluentQueryBuilderBase<T, E extends EntityType> {
82
+ protected readonly executor: QueryExecutor;
83
+ protected readonly entity: E;
84
+ protected readonly queryBuilder: QueryBuilder;
85
+
86
+ /**
87
+ * Creates a new FluentQueryBuilderBase instance.
88
+ * @param executor - The query executor to use for executing queries
89
+ * @param entity - The entity type to search
90
+ * @param queryBuilder - The underlying query builder instance
91
+ */
92
+ constructor(executor: QueryExecutor, entity: E, queryBuilder: QueryBuilder) {
93
+ this.executor = executor;
94
+ this.entity = entity;
95
+ this.queryBuilder = queryBuilder;
96
+ }
97
+
98
+ /**
99
+ * Sets the search index for full-text search.
100
+ * @param index - The search index to use
101
+ * @returns This builder for chaining
102
+ */
103
+ in(index: SearchIndex): this {
104
+ this.queryBuilder.in(index);
105
+ return this;
106
+ }
107
+
108
+ /**
109
+ * Sets the search terms.
110
+ * @param terms - Search terms to look for
111
+ * @returns This builder for chaining
112
+ */
113
+ for(terms: string): this {
114
+ this.queryBuilder.for(terms);
115
+ return this;
116
+ }
117
+
118
+ /**
119
+ * Sets the search to find semantically similar documents.
120
+ * Uses the similar_documents() DSL function.
121
+ * Available for publications and grants.
122
+ * @param text - Abstract or description text to find similar documents for
123
+ * @returns This builder for chaining
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * const result = await client
128
+ * .publications()
129
+ * .forSimilar("After spinal cord injury, macrophages infiltrate...")
130
+ * .where("year", ">", 2015)
131
+ * .limit(10)
132
+ * .execute();
133
+ * ```
134
+ */
135
+ forSimilar(text: string): this {
136
+ this.queryBuilder.forSimilar(text);
137
+ return this;
138
+ }
139
+
140
+ /**
141
+ * Sets the search to use proximity matching via the complex() DSL function.
142
+ * Finds documents where search terms appear within a maximum distance of each other.
143
+ * @param phrase - The search phrase
144
+ * @param maxDist - Maximum distance between terms (must be >= 1)
145
+ * @returns This builder for chaining
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * const result = await client
150
+ * .publications()
151
+ * .forComplex("quantum networking", 3)
152
+ * .where("year", ">", 2020)
153
+ * .limit(10)
154
+ * .execute();
155
+ * ```
156
+ */
157
+ forComplex(phrase: string, maxDist: number): this {
158
+ this.queryBuilder.forComplex(phrase, maxDist);
159
+ return this;
160
+ }
161
+
162
+ /**
163
+ * Sets the search to use minimum term matching via the min_should_match() DSL function.
164
+ * Finds documents matching at least `min` of the terms in the phrase.
165
+ * @param phrase - The search phrase
166
+ * @param min - Minimum number of terms that must match (must be >= 1)
167
+ * @returns This builder for chaining
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * const result = await client
172
+ * .publications()
173
+ * .forMinShouldMatch("quantum OR optical networking", 2)
174
+ * .where("year", ">", 2020)
175
+ * .limit(10)
176
+ * .execute();
177
+ * ```
178
+ */
179
+ forMinShouldMatch(phrase: string, min: number): this {
180
+ this.queryBuilder.forMinShouldMatch(phrase, min);
181
+ return this;
182
+ }
183
+
184
+ /**
185
+ * Adds a where clause condition.
186
+ * @param field - Field name to filter on
187
+ * @param operator - Comparison operator
188
+ * @param value - Value to compare against
189
+ * @returns This builder for chaining
190
+ */
191
+ where(field: string, operator: WhereOperator, value: string | number | boolean): this {
192
+ this.queryBuilder.where(field, operator, value);
193
+ return this;
194
+ }
195
+
196
+ /**
197
+ * Adds a condition checking if a field is empty.
198
+ * @param field - Field name to check
199
+ * @returns This builder for chaining
200
+ */
201
+ whereEmpty(field: string): this {
202
+ this.queryBuilder.whereEmpty(field);
203
+ return this;
204
+ }
205
+
206
+ /**
207
+ * Adds a condition checking if a field is not empty.
208
+ * @param field - Field name to check
209
+ * @returns This builder for chaining
210
+ */
211
+ whereNotEmpty(field: string): this {
212
+ this.queryBuilder.whereNotEmpty(field);
213
+ return this;
214
+ }
215
+
216
+ /**
217
+ * Adds a list filter condition (field in ["a", "b", "c"]).
218
+ * @param field - Field name to filter on
219
+ * @param values - Array of values to match
220
+ * @returns This builder for chaining
221
+ */
222
+ whereIn(field: string, values: readonly (string | number)[]): this {
223
+ this.queryBuilder.whereIn(field, values);
224
+ return this;
225
+ }
226
+
227
+ /**
228
+ * Adds a range filter condition (field in [start:end]).
229
+ * @param field - Field name to filter on
230
+ * @param start - Start of range (inclusive)
231
+ * @param end - End of range (inclusive)
232
+ * @returns This builder for chaining
233
+ */
234
+ whereRange(field: string, start: string | number, end: string | number): this {
235
+ this.queryBuilder.whereRange(field, start, end);
236
+ return this;
237
+ }
238
+
239
+ /**
240
+ * Adds a count filter condition (count(field) op value).
241
+ * @param field - Multi-value field name to count
242
+ * @param operator - Comparison operator
243
+ * @param value - Count to compare against
244
+ * @returns This builder for chaining
245
+ */
246
+ whereCount(field: string, operator: "=" | "!=" | ">" | "<" | ">=" | "<=", value: number): this {
247
+ this.queryBuilder.whereCount(field, operator, value);
248
+ return this;
249
+ }
250
+
251
+ /**
252
+ * Sets the next connector to OR.
253
+ * @returns This builder for chaining
254
+ */
255
+ or(): this {
256
+ this.queryBuilder.or();
257
+ return this;
258
+ }
259
+
260
+ /**
261
+ * Sets the next connector to NOT.
262
+ * @returns This builder for chaining
263
+ */
264
+ not(): this {
265
+ this.queryBuilder.not();
266
+ return this;
267
+ }
268
+
269
+ /**
270
+ * Sets the next connector to AND explicitly.
271
+ * @returns This builder for chaining
272
+ */
273
+ and(): this {
274
+ this.queryBuilder.and();
275
+ return this;
276
+ }
277
+
278
+ /**
279
+ * Opens a parenthesized group.
280
+ * @returns This builder for chaining
281
+ */
282
+ openGroup(): this {
283
+ this.queryBuilder.openGroup();
284
+ return this;
285
+ }
286
+
287
+ /**
288
+ * Closes a parenthesized group.
289
+ * @returns This builder for chaining
290
+ */
291
+ closeGroup(): this {
292
+ this.queryBuilder.closeGroup();
293
+ return this;
294
+ }
295
+
296
+ /**
297
+ * Sets the fields to return.
298
+ * When T is a known entity type, provides autocomplete for field names.
299
+ * Also accepts string[] for nested fields like "authors.name".
300
+ * @param fieldList - Array of field names to return
301
+ * @returns This builder for chaining
302
+ */
303
+ fields(fieldList: (keyof T | string)[]): this {
304
+ this.queryBuilder.fields(fieldList as string[]);
305
+ return this;
306
+ }
307
+
308
+ /**
309
+ * Sets the sort field and order.
310
+ * @param field - Field name to sort by
311
+ * @param order - Sort direction (asc or desc)
312
+ * @returns This builder for chaining
313
+ */
314
+ sort(field: string, order: SortOrder = "asc"): this {
315
+ this.queryBuilder.sort(field, order);
316
+ return this;
317
+ }
318
+
319
+ /**
320
+ * Sets the number of results to skip (for pagination).
321
+ * @param count - Number of results to skip
322
+ * @returns This builder for chaining
323
+ */
324
+ skip(count: number): this {
325
+ this.queryBuilder.skip(count);
326
+ return this;
327
+ }
328
+
329
+ /**
330
+ * Sets the maximum number of results to return.
331
+ * @param count - Maximum number of results
332
+ * @returns This builder for chaining
333
+ */
334
+ limit(count: number): this {
335
+ this.queryBuilder.limit(count);
336
+ return this;
337
+ }
338
+
339
+ /**
340
+ * Gets the built DSL query string without executing.
341
+ * Useful for debugging or logging.
342
+ * @returns The DSL query string
343
+ */
344
+ getDsl(): string {
345
+ return this.queryBuilder.build();
346
+ }
347
+
348
+ /**
349
+ * Adds a citations_per_year time-series return clause.
350
+ * Returns citation counts per year for the specified range.
351
+ *
352
+ * @param startYear - Start year for the time series (inclusive)
353
+ * @param endYear - End year for the time series (inclusive)
354
+ * @returns This builder for chaining
355
+ *
356
+ * @example
357
+ * ```typescript
358
+ * const result = await client
359
+ * .publications()
360
+ * .for("machine learning")
361
+ * .returnCitationsPerYear(2010, 2023)
362
+ * .execute();
363
+ * ```
364
+ */
365
+ returnCitationsPerYear(startYear: number, endYear: number): this {
366
+ this.queryBuilder.returnCitationsPerYear(startYear, endYear);
367
+ return this;
368
+ }
369
+
370
+ /**
371
+ * Adds a funding_per_year time-series return clause.
372
+ * Returns funding amounts per year for the specified range.
373
+ *
374
+ * @param startYear - Start year for the time series (inclusive)
375
+ * @param endYear - End year for the time series (inclusive)
376
+ * @param currency - Currency for the funding amounts (default: "USD")
377
+ * @returns This builder for chaining
378
+ *
379
+ * @example
380
+ * ```typescript
381
+ * const result = await client
382
+ * .grants()
383
+ * .for("cancer research")
384
+ * .returnFundingPerYear(2015, 2023, "EUR")
385
+ * .execute();
386
+ * ```
387
+ */
388
+ returnFundingPerYear(startYear: number, endYear: number, currency: Currency = "USD"): this {
389
+ this.queryBuilder.returnFundingPerYear(startYear, endYear, currency);
390
+ return this;
391
+ }
392
+
393
+ /**
394
+ * Sets the fields to return including unnest operations.
395
+ * Unnest flattens nested arrays into separate rows (Cartesian product).
396
+ *
397
+ * @param fieldList - Array of regular field names to return
398
+ * @param unnestFieldList - Array of field names to unnest
399
+ * @returns This builder for chaining
400
+ *
401
+ * @example
402
+ * ```typescript
403
+ * const result = await client
404
+ * .publications()
405
+ * .for("machine learning")
406
+ * .fieldsWithUnnest(["id", "title"], ["researchers", "category_for"])
407
+ * .execute();
408
+ * // Returns flattened rows - one row per researcher × category combination
409
+ * ```
410
+ */
411
+ fieldsWithUnnest(
412
+ fieldList: readonly (keyof T | string)[],
413
+ unnestFieldList: readonly string[],
414
+ ): this {
415
+ this.queryBuilder.fieldsWithUnnest(fieldList as string[], unnestFieldList);
416
+ return this;
417
+ }
418
+
419
+ /**
420
+ * Adds an unnest field to the return clause.
421
+ * Can be chained with fields() to add unnest operations.
422
+ *
423
+ * @param field - Field name to unnest
424
+ * @returns This builder for chaining
425
+ *
426
+ * @example
427
+ * ```typescript
428
+ * const result = await client
429
+ * .publications()
430
+ * .for("test")
431
+ * .fields(["id", "title"])
432
+ * .unnest("researchers")
433
+ * .unnest("category_for")
434
+ * .execute();
435
+ * ```
436
+ */
437
+ unnest(field: string): this {
438
+ this.queryBuilder.addUnnest(field);
439
+ return this;
440
+ }
441
+
442
+ /**
443
+ * Builds and executes the query against the Dimensions API.
444
+ * @returns The query result with data and totalCount
445
+ * @throws {ValidationError} If response structure is invalid
446
+ */
447
+ async execute(): Promise<FluentQueryResult<T>> {
448
+ const dsl = this.queryBuilder.build();
449
+ const response = await this.executor.rawQuery(dsl);
450
+
451
+ const entityResult = parseEntityResponse<T>(response, this.entity);
452
+
453
+ return {
454
+ data: entityResult.data as T[],
455
+ totalCount: entityResult.totalCount,
456
+ };
457
+ }
458
+ }
459
+
460
+ /**
461
+ * Fluent query builder with facet support.
462
+ * Extends FluentQueryBuilderBase to add type-safe facet methods.
463
+ *
464
+ * @template T - The entity type
465
+ * @template E - The entity type key
466
+ * @template TFacets - Record of tracked facet configurations
467
+ */
468
+ export class FluentQueryBuilderWithFacets<
469
+ T,
470
+ E extends EntityType,
471
+ TFacets extends Record<string, FacetConfig> = Record<string, never>,
472
+ > extends FluentQueryBuilderBase<T, E> {
473
+ protected readonly facetConfigs: TFacets;
474
+
475
+ constructor(
476
+ executor: QueryExecutor,
477
+ entity: E,
478
+ queryBuilder: QueryBuilder,
479
+ facetConfigs: TFacets = {} as TFacets,
480
+ ) {
481
+ super(executor, entity, queryBuilder);
482
+ this.facetConfigs = facetConfigs;
483
+ }
484
+
485
+ /**
486
+ * Adds a simple facet return clause.
487
+ * Only allows valid facet fields for this entity type.
488
+ *
489
+ * **Important:** This method returns a **new** builder instance. You must use the
490
+ * returned builder for subsequent chaining — calling `withFacet()` on the original
491
+ * builder and discarding the result will silently lose the facet configuration.
492
+ *
493
+ * @param field - The facet field
494
+ * @param options - Optional limit for facet results
495
+ * @returns A new builder with tracked facet configuration (must be used for further chaining)
496
+ */
497
+ withFacet(
498
+ field: string,
499
+ options?: { limit?: number },
500
+ ): FluentQueryBuilderWithFacets<T, E, TFacets & Record<string, FacetConfig>> {
501
+ const cloned = this.queryBuilder.clone();
502
+ cloned.returnFacet(field, options);
503
+ const newConfig: FacetConfig = {
504
+ field,
505
+ limit: options?.limit,
506
+ };
507
+ return new FluentQueryBuilderWithFacets(this.executor, this.entity, cloned, {
508
+ ...this.facetConfigs,
509
+ [field]: newConfig,
510
+ } as TFacets & Record<string, FacetConfig>);
511
+ }
512
+
513
+ /**
514
+ * Adds an aggregated facet return clause.
515
+ * Only allows valid facet fields and indicators for this entity type.
516
+ *
517
+ * **Important:** This method returns a **new** builder instance. You must use the
518
+ * returned builder for subsequent chaining — calling `withAggregate()` on the original
519
+ * builder and discarding the result will silently lose the aggregation configuration.
520
+ *
521
+ * @param field - The facet field
522
+ * @param indicators - Array of indicator names to aggregate
523
+ * @param options - Optional sort and limit options
524
+ * @returns A new builder with tracked facet configuration (must be used for further chaining)
525
+ */
526
+ withAggregate(
527
+ field: string,
528
+ indicators: readonly string[],
529
+ options?: {
530
+ sortBy?: string;
531
+ sortOrder?: SortOrder;
532
+ limit?: number;
533
+ },
534
+ ): FluentQueryBuilderWithFacets<T, E, TFacets & Record<string, FacetConfig>> {
535
+ const cloned = this.queryBuilder.clone();
536
+ cloned.returnAggregate(field, [...indicators], options);
537
+ const newConfig: FacetConfig = {
538
+ field,
539
+ indicators,
540
+ sortBy: options?.sortBy,
541
+ sortOrder: options?.sortOrder,
542
+ limit: options?.limit,
543
+ };
544
+ return new FluentQueryBuilderWithFacets(this.executor, this.entity, cloned, {
545
+ ...this.facetConfigs,
546
+ [field]: newConfig,
547
+ } as TFacets & Record<string, FacetConfig>);
548
+ }
549
+
550
+ /**
551
+ * Executes query and returns result with typed facets.
552
+ * Returns facets as a record with TypedFacetResult for each configured facet.
553
+ * Bucket types are inferred from the entity type and facet configuration.
554
+ * @param options - Optional configuration for parsing the response
555
+ * @returns Result with entities and typed facet results
556
+ */
557
+ async executeWithFacets(
558
+ options?: ParseFacetOptions,
559
+ ): Promise<FacetQueryResult<T, FacetResults<TFacets>>> {
560
+ const dsl = this.queryBuilder.build();
561
+ const response = await this.executor.rawQuery(dsl);
562
+
563
+ // Build facet field configs with indicators for validation
564
+ const facetFieldConfigs: Record<string, FacetFieldConfig> = {};
565
+ for (const [field, config] of Object.entries(this.facetConfigs)) {
566
+ facetFieldConfigs[field] = {
567
+ indicators: config.indicators,
568
+ };
569
+ }
570
+
571
+ return parseFacetResponse(
572
+ response,
573
+ this.entity,
574
+ facetFieldConfigs,
575
+ options,
576
+ ) as FacetQueryResult<T, FacetResults<TFacets>>;
577
+ }
578
+ }
579
+
580
+ /**
581
+ * Fluent query builder that wraps QueryBuilder with execute() capability.
582
+ * Provides a chainable API for building and executing Dimensions DSL queries.
583
+ *
584
+ * @template T - The entity type
585
+ * @template E - The entity type key (defaults to EntityType for backward compatibility)
586
+ *
587
+ * @example
588
+ * ```typescript
589
+ * // Use via DimensionsClient entity methods
590
+ * const result = await client
591
+ * .publications()
592
+ * .for("machine learning")
593
+ * .where("year", ">=", 2020)
594
+ * .fields(["id", "title", "doi"])
595
+ * .sort("times_cited", "desc")
596
+ * .limit(100)
597
+ * .execute();
598
+ *
599
+ * console.log(`Found ${result.totalCount} publications`);
600
+ * for (const pub of result.data) {
601
+ * console.log(pub.title);
602
+ * }
603
+ * ```
604
+ */
605
+ export class FluentQueryBuilder<
606
+ T,
607
+ E extends EntityType = EntityType,
608
+ > extends FluentQueryBuilderBase<T, E> {
609
+ /**
610
+ * Creates a new FluentQueryBuilder instance.
611
+ * @param executor - The query executor to use for executing queries
612
+ * @param entity - The entity type to search
613
+ */
614
+ constructor(executor: QueryExecutor, entity: E, schemaStore?: SchemaStore) {
615
+ const queryBuilder = new QueryBuilder(schemaStore).search(entity);
616
+ super(executor, entity, queryBuilder);
617
+ }
618
+
619
+ /**
620
+ * Adds a simple facet return clause.
621
+ * Transitions to FluentQueryBuilderWithFacets for facet execution.
622
+ *
623
+ * **Important:** This method returns a **new** builder instance. You must use the
624
+ * returned builder for subsequent chaining — calling `withFacet()` on the original
625
+ * builder and discarding the result will silently lose the facet configuration.
626
+ *
627
+ * @param field - The facet field
628
+ * @param options - Optional limit for facet results
629
+ * @returns A new builder with facet support (must be used for further chaining)
630
+ */
631
+ withFacet(
632
+ field: string,
633
+ options?: { limit?: number },
634
+ ): FluentQueryBuilderWithFacets<T, E, Record<string, FacetConfig>> {
635
+ const cloned = this.queryBuilder.clone();
636
+ cloned.returnFacet(field, options);
637
+ const config: FacetConfig = {
638
+ field,
639
+ limit: options?.limit,
640
+ };
641
+ return new FluentQueryBuilderWithFacets(this.executor, this.entity, cloned, {
642
+ [field]: config,
643
+ });
644
+ }
645
+
646
+ /**
647
+ * Adds an aggregated facet return clause.
648
+ * Transitions to FluentQueryBuilderWithFacets for facet execution.
649
+ *
650
+ * **Important:** This method returns a **new** builder instance. You must use the
651
+ * returned builder for subsequent chaining — calling `withAggregate()` on the original
652
+ * builder and discarding the result will silently lose the aggregation configuration.
653
+ *
654
+ * @param field - The facet field
655
+ * @param indicators - Array of indicator names to aggregate
656
+ * @param options - Optional sort and limit options
657
+ * @returns A new builder with facet support (must be used for further chaining)
658
+ */
659
+ withAggregate(
660
+ field: string,
661
+ indicators: readonly string[],
662
+ options?: {
663
+ sortBy?: string;
664
+ sortOrder?: SortOrder;
665
+ limit?: number;
666
+ },
667
+ ): FluentQueryBuilderWithFacets<T, E, Record<string, FacetConfig>> {
668
+ const cloned = this.queryBuilder.clone();
669
+ cloned.returnAggregate(field, [...indicators], options);
670
+ const config: FacetConfig = {
671
+ field,
672
+ indicators,
673
+ sortBy: options?.sortBy,
674
+ sortOrder: options?.sortOrder,
675
+ limit: options?.limit,
676
+ };
677
+ return new FluentQueryBuilderWithFacets(this.executor, this.entity, cloned, {
678
+ [field]: config,
679
+ });
680
+ }
681
+ }
682
+
683
+ // Re-export types for convenience
684
+ export type { FacetQueryResult, TypedFacetResult } from "./response-parser.js";