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