@constructive-io/graphql-codegen 2.19.0 → 2.20.1

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 (301) hide show
  1. package/README.md +1818 -113
  2. package/__tests__/codegen/input-types-generator.test.d.ts +1 -0
  3. package/__tests__/codegen/input-types-generator.test.js +635 -0
  4. package/cli/codegen/barrel.d.ts +27 -0
  5. package/cli/codegen/barrel.js +163 -0
  6. package/cli/codegen/client.d.ts +4 -0
  7. package/cli/codegen/client.js +170 -0
  8. package/cli/codegen/custom-mutations.d.ts +38 -0
  9. package/cli/codegen/custom-mutations.js +149 -0
  10. package/cli/codegen/custom-queries.d.ts +38 -0
  11. package/cli/codegen/custom-queries.js +358 -0
  12. package/cli/codegen/filters.d.ts +27 -0
  13. package/cli/codegen/filters.js +357 -0
  14. package/cli/codegen/gql-ast.d.ts +41 -0
  15. package/cli/codegen/gql-ast.js +329 -0
  16. package/cli/codegen/index.d.ts +71 -0
  17. package/cli/codegen/index.js +147 -0
  18. package/cli/codegen/mutations.d.ts +30 -0
  19. package/cli/codegen/mutations.js +410 -0
  20. package/cli/codegen/orm/barrel.d.ts +18 -0
  21. package/cli/codegen/orm/barrel.js +48 -0
  22. package/cli/codegen/orm/client-generator.d.ts +45 -0
  23. package/cli/codegen/orm/client-generator.js +646 -0
  24. package/cli/codegen/orm/custom-ops-generator.d.ts +30 -0
  25. package/cli/codegen/orm/custom-ops-generator.js +350 -0
  26. package/cli/codegen/orm/index.d.ts +38 -0
  27. package/cli/codegen/orm/index.js +88 -0
  28. package/cli/codegen/orm/input-types-generator.d.ts +21 -0
  29. package/cli/codegen/orm/input-types-generator.js +705 -0
  30. package/cli/codegen/orm/input-types-generator.test.d.ts +1 -0
  31. package/cli/codegen/orm/input-types-generator.test.js +75 -0
  32. package/cli/codegen/orm/model-generator.d.ts +32 -0
  33. package/cli/codegen/orm/model-generator.js +264 -0
  34. package/cli/codegen/orm/query-builder.d.ts +161 -0
  35. package/cli/codegen/orm/query-builder.js +366 -0
  36. package/cli/codegen/orm/select-types.d.ts +169 -0
  37. package/cli/codegen/orm/select-types.js +16 -0
  38. package/cli/codegen/orm/select-types.test.d.ts +11 -0
  39. package/cli/codegen/orm/select-types.test.js +22 -0
  40. package/cli/codegen/queries.d.ts +25 -0
  41. package/cli/codegen/queries.js +438 -0
  42. package/cli/codegen/scalars.d.ts +12 -0
  43. package/cli/codegen/scalars.js +71 -0
  44. package/cli/codegen/schema-gql-ast.d.ts +51 -0
  45. package/cli/codegen/schema-gql-ast.js +385 -0
  46. package/cli/codegen/ts-ast.d.ts +122 -0
  47. package/cli/codegen/ts-ast.js +280 -0
  48. package/cli/codegen/type-resolver.d.ts +96 -0
  49. package/cli/codegen/type-resolver.js +246 -0
  50. package/cli/codegen/types.d.ts +12 -0
  51. package/cli/codegen/types.js +69 -0
  52. package/cli/codegen/utils.d.ts +163 -0
  53. package/cli/codegen/utils.js +326 -0
  54. package/cli/commands/generate-orm.d.ts +37 -0
  55. package/cli/commands/generate-orm.js +195 -0
  56. package/cli/commands/generate.d.ts +39 -0
  57. package/cli/commands/generate.js +299 -0
  58. package/cli/commands/index.d.ts +7 -0
  59. package/cli/commands/index.js +12 -0
  60. package/cli/commands/init.d.ts +35 -0
  61. package/cli/commands/init.js +176 -0
  62. package/cli/index.d.ts +4 -0
  63. package/cli/index.js +291 -0
  64. package/cli/introspect/fetch-meta.d.ts +31 -0
  65. package/cli/introspect/fetch-meta.js +108 -0
  66. package/cli/introspect/fetch-schema.d.ts +21 -0
  67. package/cli/introspect/fetch-schema.js +86 -0
  68. package/cli/introspect/index.d.ts +8 -0
  69. package/cli/introspect/index.js +16 -0
  70. package/cli/introspect/meta-query.d.ts +111 -0
  71. package/cli/introspect/meta-query.js +191 -0
  72. package/cli/introspect/schema-query.d.ts +20 -0
  73. package/cli/introspect/schema-query.js +123 -0
  74. package/cli/introspect/transform-schema.d.ts +74 -0
  75. package/cli/introspect/transform-schema.js +269 -0
  76. package/cli/introspect/transform-schema.test.d.ts +1 -0
  77. package/cli/introspect/transform-schema.test.js +67 -0
  78. package/cli/introspect/transform.d.ts +21 -0
  79. package/cli/introspect/transform.js +216 -0
  80. package/cli/watch/cache.d.ts +45 -0
  81. package/cli/watch/cache.js +111 -0
  82. package/cli/watch/debounce.d.ts +19 -0
  83. package/cli/watch/debounce.js +89 -0
  84. package/cli/watch/hash.d.ts +17 -0
  85. package/cli/watch/hash.js +48 -0
  86. package/cli/watch/index.d.ts +10 -0
  87. package/cli/watch/index.js +22 -0
  88. package/cli/watch/orchestrator.d.ts +63 -0
  89. package/cli/watch/orchestrator.js +228 -0
  90. package/cli/watch/poller.d.ts +65 -0
  91. package/cli/watch/poller.js +203 -0
  92. package/cli/watch/types.d.ts +67 -0
  93. package/cli/watch/types.js +5 -0
  94. package/client/error.d.ts +95 -0
  95. package/client/error.js +255 -0
  96. package/client/execute.d.ts +57 -0
  97. package/client/execute.js +124 -0
  98. package/client/index.d.ts +6 -0
  99. package/client/index.js +18 -0
  100. package/client/typed-document.d.ts +31 -0
  101. package/client/typed-document.js +44 -0
  102. package/core/ast.d.ts +10 -0
  103. package/core/ast.js +593 -0
  104. package/core/custom-ast.d.ts +35 -0
  105. package/core/custom-ast.js +204 -0
  106. package/core/index.d.ts +8 -0
  107. package/core/index.js +33 -0
  108. package/core/meta-object/convert.d.ts +65 -0
  109. package/core/meta-object/convert.js +63 -0
  110. package/core/meta-object/format.json +93 -0
  111. package/core/meta-object/index.d.ts +2 -0
  112. package/core/meta-object/index.js +18 -0
  113. package/core/meta-object/validate.d.ts +9 -0
  114. package/core/meta-object/validate.js +34 -0
  115. package/core/query-builder.d.ts +46 -0
  116. package/core/query-builder.js +412 -0
  117. package/core/types.d.ts +139 -0
  118. package/core/types.js +28 -0
  119. package/esm/__tests__/codegen/input-types-generator.test.d.ts +1 -0
  120. package/esm/__tests__/codegen/input-types-generator.test.js +633 -0
  121. package/esm/cli/codegen/barrel.d.ts +27 -0
  122. package/esm/cli/codegen/barrel.js +156 -0
  123. package/esm/cli/codegen/client.d.ts +4 -0
  124. package/esm/cli/codegen/client.js +167 -0
  125. package/esm/cli/codegen/custom-mutations.d.ts +38 -0
  126. package/esm/cli/codegen/custom-mutations.js +145 -0
  127. package/esm/cli/codegen/custom-queries.d.ts +38 -0
  128. package/esm/cli/codegen/custom-queries.js +354 -0
  129. package/esm/cli/codegen/filters.d.ts +27 -0
  130. package/esm/cli/codegen/filters.js +351 -0
  131. package/esm/cli/codegen/gql-ast.d.ts +41 -0
  132. package/esm/cli/codegen/gql-ast.js +288 -0
  133. package/esm/cli/codegen/index.d.ts +71 -0
  134. package/esm/cli/codegen/index.js +124 -0
  135. package/esm/cli/codegen/mutations.d.ts +30 -0
  136. package/esm/cli/codegen/mutations.js +404 -0
  137. package/esm/cli/codegen/orm/barrel.d.ts +18 -0
  138. package/esm/cli/codegen/orm/barrel.js +44 -0
  139. package/esm/cli/codegen/orm/client-generator.d.ts +45 -0
  140. package/esm/cli/codegen/orm/client-generator.js +640 -0
  141. package/esm/cli/codegen/orm/custom-ops-generator.d.ts +30 -0
  142. package/esm/cli/codegen/orm/custom-ops-generator.js +346 -0
  143. package/esm/cli/codegen/orm/index.d.ts +38 -0
  144. package/esm/cli/codegen/orm/index.js +75 -0
  145. package/esm/cli/codegen/orm/input-types-generator.d.ts +21 -0
  146. package/esm/cli/codegen/orm/input-types-generator.js +700 -0
  147. package/esm/cli/codegen/orm/input-types-generator.test.d.ts +1 -0
  148. package/esm/cli/codegen/orm/input-types-generator.test.js +73 -0
  149. package/esm/cli/codegen/orm/model-generator.d.ts +32 -0
  150. package/esm/cli/codegen/orm/model-generator.js +260 -0
  151. package/esm/cli/codegen/orm/query-builder.d.ts +161 -0
  152. package/esm/cli/codegen/orm/query-builder.js +353 -0
  153. package/esm/cli/codegen/orm/select-types.d.ts +169 -0
  154. package/esm/cli/codegen/orm/select-types.js +15 -0
  155. package/esm/cli/codegen/orm/select-types.test.d.ts +11 -0
  156. package/esm/cli/codegen/orm/select-types.test.js +21 -0
  157. package/esm/cli/codegen/queries.d.ts +25 -0
  158. package/esm/cli/codegen/queries.js +433 -0
  159. package/esm/cli/codegen/scalars.d.ts +12 -0
  160. package/esm/cli/codegen/scalars.js +66 -0
  161. package/esm/cli/codegen/schema-gql-ast.d.ts +51 -0
  162. package/esm/cli/codegen/schema-gql-ast.js +343 -0
  163. package/esm/cli/codegen/ts-ast.d.ts +122 -0
  164. package/esm/cli/codegen/ts-ast.js +260 -0
  165. package/esm/cli/codegen/type-resolver.d.ts +96 -0
  166. package/esm/cli/codegen/type-resolver.js +224 -0
  167. package/esm/cli/codegen/types.d.ts +12 -0
  168. package/esm/cli/codegen/types.js +65 -0
  169. package/esm/cli/codegen/utils.d.ts +163 -0
  170. package/esm/cli/codegen/utils.js +288 -0
  171. package/esm/cli/commands/generate-orm.d.ts +37 -0
  172. package/esm/cli/commands/generate-orm.js +192 -0
  173. package/esm/cli/commands/generate.d.ts +39 -0
  174. package/esm/cli/commands/generate.js +262 -0
  175. package/esm/cli/commands/index.d.ts +7 -0
  176. package/esm/cli/commands/index.js +5 -0
  177. package/esm/cli/commands/init.d.ts +35 -0
  178. package/esm/cli/commands/init.js +138 -0
  179. package/esm/cli/index.d.ts +4 -0
  180. package/esm/cli/index.js +256 -0
  181. package/esm/cli/introspect/fetch-meta.d.ts +31 -0
  182. package/esm/cli/introspect/fetch-meta.js +104 -0
  183. package/esm/cli/introspect/fetch-schema.d.ts +21 -0
  184. package/esm/cli/introspect/fetch-schema.js +83 -0
  185. package/esm/cli/introspect/index.d.ts +8 -0
  186. package/esm/cli/introspect/index.js +6 -0
  187. package/esm/cli/introspect/meta-query.d.ts +111 -0
  188. package/esm/cli/introspect/meta-query.js +188 -0
  189. package/esm/cli/introspect/schema-query.d.ts +20 -0
  190. package/esm/cli/introspect/schema-query.js +120 -0
  191. package/esm/cli/introspect/transform-schema.d.ts +74 -0
  192. package/esm/cli/introspect/transform-schema.js +259 -0
  193. package/esm/cli/introspect/transform-schema.test.d.ts +1 -0
  194. package/esm/cli/introspect/transform-schema.test.js +65 -0
  195. package/esm/cli/introspect/transform.d.ts +21 -0
  196. package/esm/cli/introspect/transform.js +210 -0
  197. package/esm/cli/watch/cache.d.ts +45 -0
  198. package/esm/cli/watch/cache.js +73 -0
  199. package/esm/cli/watch/debounce.d.ts +19 -0
  200. package/esm/cli/watch/debounce.js +85 -0
  201. package/esm/cli/watch/hash.d.ts +17 -0
  202. package/esm/cli/watch/hash.js +43 -0
  203. package/esm/cli/watch/index.d.ts +10 -0
  204. package/esm/cli/watch/index.js +8 -0
  205. package/esm/cli/watch/orchestrator.d.ts +63 -0
  206. package/esm/cli/watch/orchestrator.js +223 -0
  207. package/esm/cli/watch/poller.d.ts +65 -0
  208. package/esm/cli/watch/poller.js +198 -0
  209. package/esm/cli/watch/types.d.ts +67 -0
  210. package/esm/cli/watch/types.js +4 -0
  211. package/esm/client/error.d.ts +95 -0
  212. package/esm/client/error.js +249 -0
  213. package/esm/client/execute.d.ts +57 -0
  214. package/esm/client/execute.js +120 -0
  215. package/esm/client/index.d.ts +6 -0
  216. package/esm/client/index.js +6 -0
  217. package/esm/client/typed-document.d.ts +31 -0
  218. package/esm/client/typed-document.js +40 -0
  219. package/esm/core/ast.d.ts +10 -0
  220. package/esm/core/ast.js +549 -0
  221. package/esm/core/custom-ast.d.ts +35 -0
  222. package/esm/core/custom-ast.js +161 -0
  223. package/esm/core/index.d.ts +8 -0
  224. package/esm/core/index.js +12 -0
  225. package/esm/core/meta-object/convert.d.ts +65 -0
  226. package/esm/core/meta-object/convert.js +60 -0
  227. package/esm/core/meta-object/format.json +93 -0
  228. package/esm/core/meta-object/index.d.ts +2 -0
  229. package/esm/core/meta-object/index.js +2 -0
  230. package/esm/core/meta-object/validate.d.ts +9 -0
  231. package/esm/core/meta-object/validate.js +28 -0
  232. package/esm/core/query-builder.d.ts +46 -0
  233. package/esm/core/query-builder.js +375 -0
  234. package/esm/core/types.d.ts +139 -0
  235. package/esm/core/types.js +24 -0
  236. package/esm/generators/field-selector.d.ts +30 -0
  237. package/esm/generators/field-selector.js +355 -0
  238. package/esm/generators/index.d.ts +6 -0
  239. package/esm/generators/index.js +9 -0
  240. package/esm/generators/mutations.d.ts +31 -0
  241. package/esm/generators/mutations.js +197 -0
  242. package/esm/generators/select.d.ts +50 -0
  243. package/esm/generators/select.js +636 -0
  244. package/esm/index.d.ts +12 -0
  245. package/esm/index.js +17 -3
  246. package/esm/react/index.d.ts +5 -0
  247. package/esm/react/index.js +6 -0
  248. package/esm/types/config.d.ts +199 -0
  249. package/esm/types/config.js +106 -0
  250. package/esm/types/index.d.ts +9 -0
  251. package/esm/types/index.js +4 -0
  252. package/esm/types/introspection.d.ts +121 -0
  253. package/esm/types/introspection.js +54 -0
  254. package/esm/types/mutation.d.ts +45 -0
  255. package/esm/types/mutation.js +4 -0
  256. package/esm/types/query.d.ts +82 -0
  257. package/esm/types/query.js +4 -0
  258. package/esm/types/schema.d.ts +253 -0
  259. package/esm/types/schema.js +5 -0
  260. package/esm/types/selection.d.ts +43 -0
  261. package/esm/types/selection.js +4 -0
  262. package/esm/utils/index.d.ts +4 -0
  263. package/esm/utils/index.js +4 -0
  264. package/generators/field-selector.d.ts +30 -0
  265. package/generators/field-selector.js +361 -0
  266. package/generators/index.d.ts +6 -0
  267. package/generators/index.js +27 -0
  268. package/generators/mutations.d.ts +31 -0
  269. package/generators/mutations.js +235 -0
  270. package/generators/select.d.ts +50 -0
  271. package/generators/select.js +679 -0
  272. package/index.d.ts +12 -3
  273. package/index.js +19 -3
  274. package/package.json +59 -38
  275. package/react/index.d.ts +5 -0
  276. package/react/index.js +9 -0
  277. package/types/config.d.ts +199 -0
  278. package/types/config.js +111 -0
  279. package/types/index.d.ts +9 -0
  280. package/types/index.js +10 -0
  281. package/types/introspection.d.ts +121 -0
  282. package/types/introspection.js +62 -0
  283. package/types/mutation.d.ts +45 -0
  284. package/types/mutation.js +5 -0
  285. package/types/query.d.ts +82 -0
  286. package/types/query.js +5 -0
  287. package/types/schema.d.ts +253 -0
  288. package/types/schema.js +6 -0
  289. package/types/selection.d.ts +43 -0
  290. package/types/selection.js +5 -0
  291. package/utils/index.d.ts +4 -0
  292. package/utils/index.js +7 -0
  293. package/codegen.d.ts +0 -13
  294. package/codegen.js +0 -293
  295. package/esm/codegen.js +0 -253
  296. package/esm/gql.js +0 -939
  297. package/esm/options.js +0 -27
  298. package/gql.d.ts +0 -188
  299. package/gql.js +0 -992
  300. package/options.d.ts +0 -45
  301. package/options.js +0 -31
@@ -0,0 +1,354 @@
1
+ import { createProject, createSourceFile, getFormattedOutput, createFileHeader, createImport, createInterface, createConst, } from './ts-ast';
2
+ import { buildCustomQueryString } from './schema-gql-ast';
3
+ import { typeRefToTsType, isTypeRequired, getOperationHookName, getOperationFileName, getOperationVariablesTypeName, getOperationResultTypeName, getDocumentConstName, getQueryKeyName, } from './type-resolver';
4
+ import { ucFirst } from './utils';
5
+ /**
6
+ * Generate a custom query hook file
7
+ */
8
+ export function generateCustomQueryHook(options) {
9
+ const { operation, typeRegistry, maxDepth = 2, skipQueryField = true } = options;
10
+ const project = createProject();
11
+ const hookName = getOperationHookName(operation.name, 'query');
12
+ const fileName = getOperationFileName(operation.name, 'query');
13
+ const variablesTypeName = getOperationVariablesTypeName(operation.name, 'query');
14
+ const resultTypeName = getOperationResultTypeName(operation.name, 'query');
15
+ const documentConstName = getDocumentConstName(operation.name, 'query');
16
+ const queryKeyName = getQueryKeyName(operation.name);
17
+ // Generate GraphQL document
18
+ const queryDocument = buildCustomQueryString({
19
+ operation,
20
+ typeRegistry,
21
+ maxDepth,
22
+ skipQueryField,
23
+ });
24
+ const sourceFile = createSourceFile(project, fileName);
25
+ // Add file header
26
+ sourceFile.insertText(0, createFileHeader(`Custom query hook for ${operation.name}`) + '\n\n');
27
+ // Add imports
28
+ sourceFile.addImportDeclarations([
29
+ createImport({
30
+ moduleSpecifier: '@tanstack/react-query',
31
+ namedImports: ['useQuery'],
32
+ typeOnlyNamedImports: ['UseQueryOptions', 'QueryClient'],
33
+ }),
34
+ createImport({
35
+ moduleSpecifier: '../client',
36
+ namedImports: ['execute'],
37
+ typeOnlyNamedImports: ['ExecuteOptions'],
38
+ }),
39
+ ]);
40
+ // Add query document constant
41
+ sourceFile.addVariableStatement(createConst(documentConstName, '`\n' + queryDocument + '`', {
42
+ docs: ['GraphQL query document'],
43
+ }));
44
+ // Generate variables interface if there are arguments
45
+ if (operation.args.length > 0) {
46
+ const variablesProps = generateVariablesProperties(operation.args);
47
+ sourceFile.addInterface(createInterface(variablesTypeName, variablesProps));
48
+ }
49
+ // Generate result interface
50
+ const resultType = typeRefToTsType(operation.returnType);
51
+ const resultProps = [
52
+ { name: operation.name, type: resultType },
53
+ ];
54
+ sourceFile.addInterface(createInterface(resultTypeName, resultProps));
55
+ // Query key factory
56
+ if (operation.args.length > 0) {
57
+ sourceFile.addVariableStatement(createConst(queryKeyName, `(variables?: ${variablesTypeName}) =>
58
+ ['${operation.name}', variables] as const`, { docs: ['Query key factory for caching'] }));
59
+ }
60
+ else {
61
+ sourceFile.addVariableStatement(createConst(queryKeyName, `() => ['${operation.name}'] as const`, {
62
+ docs: ['Query key factory for caching'],
63
+ }));
64
+ }
65
+ // Generate hook function
66
+ const hookParams = generateHookParameters(operation, variablesTypeName, resultTypeName);
67
+ const hookBody = generateHookBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName);
68
+ const hookDoc = generateHookDoc(operation, hookName);
69
+ sourceFile.addFunction({
70
+ name: hookName,
71
+ isExported: true,
72
+ parameters: hookParams,
73
+ statements: hookBody,
74
+ docs: [{ description: hookDoc }],
75
+ });
76
+ // Add standalone functions section
77
+ sourceFile.addStatements('\n// ============================================================================');
78
+ sourceFile.addStatements('// Standalone Functions (non-React)');
79
+ sourceFile.addStatements('// ============================================================================\n');
80
+ // Generate standalone fetch function
81
+ const fetchFnName = `fetch${ucFirst(operation.name)}Query`;
82
+ const fetchParams = generateFetchParameters(operation, variablesTypeName);
83
+ const fetchBody = generateFetchBody(operation, documentConstName, variablesTypeName, resultTypeName);
84
+ const fetchDoc = generateFetchDoc(operation, fetchFnName);
85
+ sourceFile.addFunction({
86
+ name: fetchFnName,
87
+ isExported: true,
88
+ isAsync: true,
89
+ parameters: fetchParams,
90
+ returnType: `Promise<${resultTypeName}>`,
91
+ statements: fetchBody,
92
+ docs: [{ description: fetchDoc }],
93
+ });
94
+ // Generate prefetch function
95
+ const prefetchFnName = `prefetch${ucFirst(operation.name)}Query`;
96
+ const prefetchParams = generatePrefetchParameters(operation, variablesTypeName);
97
+ const prefetchBody = generatePrefetchBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName);
98
+ const prefetchDoc = generatePrefetchDoc(operation, prefetchFnName);
99
+ sourceFile.addFunction({
100
+ name: prefetchFnName,
101
+ isExported: true,
102
+ isAsync: true,
103
+ parameters: prefetchParams,
104
+ returnType: 'Promise<void>',
105
+ statements: prefetchBody,
106
+ docs: [{ description: prefetchDoc }],
107
+ });
108
+ return {
109
+ fileName,
110
+ content: getFormattedOutput(sourceFile),
111
+ operationName: operation.name,
112
+ };
113
+ }
114
+ // ============================================================================
115
+ // Helper functions
116
+ // ============================================================================
117
+ /**
118
+ * Generate interface properties from CleanArguments
119
+ */
120
+ function generateVariablesProperties(args) {
121
+ return args.map((arg) => ({
122
+ name: arg.name,
123
+ type: typeRefToTsType(arg.type),
124
+ optional: !isTypeRequired(arg.type),
125
+ docs: arg.description ? [arg.description] : undefined,
126
+ }));
127
+ }
128
+ /**
129
+ * Generate hook function parameters
130
+ */
131
+ function generateHookParameters(operation, variablesTypeName, resultTypeName) {
132
+ const params = [];
133
+ // Add variables parameter if there are required args
134
+ const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type));
135
+ if (operation.args.length > 0) {
136
+ params.push({
137
+ name: 'variables',
138
+ type: variablesTypeName,
139
+ hasQuestionToken: !hasRequiredArgs,
140
+ });
141
+ }
142
+ // Add options parameter
143
+ params.push({
144
+ name: 'options',
145
+ type: `Omit<UseQueryOptions<${resultTypeName}, Error>, 'queryKey' | 'queryFn'>`,
146
+ hasQuestionToken: true,
147
+ });
148
+ return params;
149
+ }
150
+ /**
151
+ * Generate hook function body
152
+ */
153
+ function generateHookBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName) {
154
+ const hasArgs = operation.args.length > 0;
155
+ const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type));
156
+ if (hasArgs) {
157
+ // With variables
158
+ const enabledCondition = hasRequiredArgs
159
+ ? `enabled: !!variables && (options?.enabled !== false),`
160
+ : '';
161
+ return `return useQuery({
162
+ queryKey: ${queryKeyName}(variables),
163
+ queryFn: () => execute<${resultTypeName}, ${variablesTypeName}>(
164
+ ${documentConstName},
165
+ variables
166
+ ),
167
+ ${enabledCondition}
168
+ ...options,
169
+ });`;
170
+ }
171
+ else {
172
+ // No variables
173
+ return `return useQuery({
174
+ queryKey: ${queryKeyName}(),
175
+ queryFn: () => execute<${resultTypeName}>(${documentConstName}),
176
+ ...options,
177
+ });`;
178
+ }
179
+ }
180
+ /**
181
+ * Generate hook JSDoc documentation
182
+ */
183
+ function generateHookDoc(operation, hookName) {
184
+ const description = operation.description
185
+ ? operation.description
186
+ : `Query hook for ${operation.name}`;
187
+ const hasArgs = operation.args.length > 0;
188
+ let example;
189
+ if (hasArgs) {
190
+ const argNames = operation.args.map((a) => a.name).join(', ');
191
+ example = `
192
+ @example
193
+ \`\`\`tsx
194
+ const { data, isLoading } = ${hookName}({ ${argNames} });
195
+
196
+ if (data?.${operation.name}) {
197
+ console.log(data.${operation.name});
198
+ }
199
+ \`\`\``;
200
+ }
201
+ else {
202
+ example = `
203
+ @example
204
+ \`\`\`tsx
205
+ const { data, isLoading } = ${hookName}();
206
+
207
+ if (data?.${operation.name}) {
208
+ console.log(data.${operation.name});
209
+ }
210
+ \`\`\``;
211
+ }
212
+ return description + '\n' + example;
213
+ }
214
+ // ============================================================================
215
+ // Standalone function generators
216
+ // ============================================================================
217
+ /**
218
+ * Generate fetch function parameters
219
+ */
220
+ function generateFetchParameters(operation, variablesTypeName) {
221
+ const params = [];
222
+ if (operation.args.length > 0) {
223
+ const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type));
224
+ params.push({
225
+ name: 'variables',
226
+ type: variablesTypeName,
227
+ hasQuestionToken: !hasRequiredArgs,
228
+ });
229
+ }
230
+ params.push({
231
+ name: 'options',
232
+ type: 'ExecuteOptions',
233
+ hasQuestionToken: true,
234
+ });
235
+ return params;
236
+ }
237
+ /**
238
+ * Generate fetch function body
239
+ */
240
+ function generateFetchBody(operation, documentConstName, variablesTypeName, resultTypeName) {
241
+ if (operation.args.length > 0) {
242
+ return `return execute<${resultTypeName}, ${variablesTypeName}>(
243
+ ${documentConstName},
244
+ variables,
245
+ options
246
+ );`;
247
+ }
248
+ else {
249
+ return `return execute<${resultTypeName}>(${documentConstName}, undefined, options);`;
250
+ }
251
+ }
252
+ /**
253
+ * Generate fetch function documentation
254
+ */
255
+ function generateFetchDoc(operation, fnName) {
256
+ const description = `Fetch ${operation.name} without React hooks`;
257
+ if (operation.args.length > 0) {
258
+ const argNames = operation.args.map((a) => a.name).join(', ');
259
+ return `${description}
260
+
261
+ @example
262
+ \`\`\`ts
263
+ const data = await ${fnName}({ ${argNames} });
264
+ \`\`\``;
265
+ }
266
+ else {
267
+ return `${description}
268
+
269
+ @example
270
+ \`\`\`ts
271
+ const data = await ${fnName}();
272
+ \`\`\``;
273
+ }
274
+ }
275
+ /**
276
+ * Generate prefetch function parameters
277
+ */
278
+ function generatePrefetchParameters(operation, variablesTypeName) {
279
+ const params = [
280
+ { name: 'queryClient', type: 'QueryClient' },
281
+ ];
282
+ if (operation.args.length > 0) {
283
+ const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type));
284
+ params.push({
285
+ name: 'variables',
286
+ type: variablesTypeName,
287
+ hasQuestionToken: !hasRequiredArgs,
288
+ });
289
+ }
290
+ params.push({
291
+ name: 'options',
292
+ type: 'ExecuteOptions',
293
+ hasQuestionToken: true,
294
+ });
295
+ return params;
296
+ }
297
+ /**
298
+ * Generate prefetch function body
299
+ */
300
+ function generatePrefetchBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName) {
301
+ if (operation.args.length > 0) {
302
+ return `await queryClient.prefetchQuery({
303
+ queryKey: ${queryKeyName}(variables),
304
+ queryFn: () => execute<${resultTypeName}, ${variablesTypeName}>(
305
+ ${documentConstName},
306
+ variables,
307
+ options
308
+ ),
309
+ });`;
310
+ }
311
+ else {
312
+ return `await queryClient.prefetchQuery({
313
+ queryKey: ${queryKeyName}(),
314
+ queryFn: () => execute<${resultTypeName}>(${documentConstName}, undefined, options),
315
+ });`;
316
+ }
317
+ }
318
+ /**
319
+ * Generate prefetch function documentation
320
+ */
321
+ function generatePrefetchDoc(operation, fnName) {
322
+ const description = `Prefetch ${operation.name} for SSR or cache warming`;
323
+ if (operation.args.length > 0) {
324
+ const argNames = operation.args.map((a) => a.name).join(', ');
325
+ return `${description}
326
+
327
+ @example
328
+ \`\`\`ts
329
+ await ${fnName}(queryClient, { ${argNames} });
330
+ \`\`\``;
331
+ }
332
+ else {
333
+ return `${description}
334
+
335
+ @example
336
+ \`\`\`ts
337
+ await ${fnName}(queryClient);
338
+ \`\`\``;
339
+ }
340
+ }
341
+ /**
342
+ * Generate all custom query hook files
343
+ */
344
+ export function generateAllCustomQueryHooks(options) {
345
+ const { operations, typeRegistry, maxDepth = 2, skipQueryField = true } = options;
346
+ return operations
347
+ .filter((op) => op.kind === 'query')
348
+ .map((operation) => generateCustomQueryHook({
349
+ operation,
350
+ typeRegistry,
351
+ maxDepth,
352
+ skipQueryField,
353
+ }));
354
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * PostGraphile filter type generators
3
+ *
4
+ * Generates TypeScript interfaces for PostGraphile filter types:
5
+ * - Base scalar filters (StringFilter, IntFilter, etc.)
6
+ * - Table-specific filters (CarFilter, UserFilter, etc.)
7
+ * - OrderBy enum types
8
+ */
9
+ import type { CleanTable } from '../../types/schema';
10
+ /**
11
+ * Generate all base PostGraphile filter types
12
+ * These are shared across all tables
13
+ */
14
+ export declare function generateBaseFilterTypes(): string;
15
+ /**
16
+ * Generate filter interface for a specific table
17
+ */
18
+ export declare function generateTableFilter(table: CleanTable): string;
19
+ /**
20
+ * Generate OrderBy type for a specific table
21
+ */
22
+ export declare function generateTableOrderBy(table: CleanTable): string;
23
+ /**
24
+ * Generate inline filter and orderBy types for a query hook file
25
+ * These are embedded directly in the hook file for self-containment
26
+ */
27
+ export declare function generateInlineFilterTypes(table: CleanTable): string;