@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,549 @@
1
+ import * as t from 'gql-ast';
2
+ import * as inflection from 'inflection';
3
+ import { getCustomAst } from './custom-ast';
4
+ const NON_MUTABLE_PROPS = ['createdAt', 'createdBy', 'updatedAt', 'updatedBy'];
5
+ const objectToArray = (obj) => Object.keys(obj).map((k) => ({
6
+ key: k,
7
+ name: obj[k].name || k,
8
+ type: obj[k].type,
9
+ isNotNull: obj[k].isNotNull,
10
+ isArray: obj[k].isArray,
11
+ isArrayNotNull: obj[k].isArrayNotNull,
12
+ properties: obj[k].properties,
13
+ }));
14
+ const createGqlMutation = ({ operationName, mutationName, selectArgs, selections, variableDefinitions, modelName, useModel = true, }) => {
15
+ const opSel = !modelName
16
+ ? [
17
+ t.field({
18
+ name: operationName,
19
+ args: selectArgs,
20
+ selectionSet: t.selectionSet({ selections }),
21
+ }),
22
+ ]
23
+ : [
24
+ t.field({
25
+ name: operationName,
26
+ args: selectArgs,
27
+ selectionSet: t.selectionSet({
28
+ selections: useModel
29
+ ? [
30
+ t.field({
31
+ name: modelName,
32
+ selectionSet: t.selectionSet({ selections }),
33
+ }),
34
+ ]
35
+ : selections,
36
+ }),
37
+ }),
38
+ ];
39
+ return t.document({
40
+ definitions: [
41
+ t.operationDefinition({
42
+ operation: 'mutation',
43
+ name: mutationName,
44
+ variableDefinitions,
45
+ selectionSet: t.selectionSet({ selections: opSel }),
46
+ }),
47
+ ],
48
+ });
49
+ };
50
+ export const getAll = ({ queryName, operationName, selection, }) => {
51
+ const selections = getSelections(selection);
52
+ const opSel = [
53
+ t.field({
54
+ name: operationName,
55
+ selectionSet: t.selectionSet({
56
+ selections: [
57
+ t.field({
58
+ name: 'totalCount',
59
+ }),
60
+ t.field({
61
+ name: 'nodes',
62
+ selectionSet: t.selectionSet({ selections }),
63
+ }),
64
+ ],
65
+ }),
66
+ }),
67
+ ];
68
+ const ast = t.document({
69
+ definitions: [
70
+ t.operationDefinition({
71
+ operation: 'query',
72
+ name: queryName,
73
+ selectionSet: t.selectionSet({ selections: opSel }),
74
+ }),
75
+ ],
76
+ });
77
+ return ast;
78
+ };
79
+ export const getCount = ({ queryName, operationName, query, }) => {
80
+ const Singular = query.model;
81
+ const Filter = `${Singular}Filter`;
82
+ const Condition = `${Singular}Condition`;
83
+ const variableDefinitions = [
84
+ t.variableDefinition({
85
+ variable: t.variable({ name: 'condition' }),
86
+ type: t.namedType({ type: Condition }),
87
+ }),
88
+ t.variableDefinition({
89
+ variable: t.variable({ name: 'filter' }),
90
+ type: t.namedType({ type: Filter }),
91
+ }),
92
+ ];
93
+ const args = [
94
+ t.argument({ name: 'condition', value: t.variable({ name: 'condition' }) }),
95
+ t.argument({ name: 'filter', value: t.variable({ name: 'filter' }) }),
96
+ ];
97
+ // PostGraphile supports totalCount through connections
98
+ const opSel = [
99
+ t.field({
100
+ name: operationName,
101
+ args,
102
+ selectionSet: t.selectionSet({
103
+ selections: [
104
+ t.field({
105
+ name: 'totalCount',
106
+ }),
107
+ ],
108
+ }),
109
+ }),
110
+ ];
111
+ const ast = t.document({
112
+ definitions: [
113
+ t.operationDefinition({
114
+ operation: 'query',
115
+ name: queryName,
116
+ variableDefinitions,
117
+ selectionSet: t.selectionSet({ selections: opSel }),
118
+ }),
119
+ ],
120
+ });
121
+ return ast;
122
+ };
123
+ export const getMany = ({ builder, queryName, operationName, query, selection, }) => {
124
+ const Singular = query.model;
125
+ const Plural = operationName.charAt(0).toUpperCase() + operationName.slice(1);
126
+ const Condition = `${Singular}Condition`;
127
+ const Filter = `${Singular}Filter`;
128
+ const OrderBy = `${Plural}OrderBy`;
129
+ const selections = getSelections(selection);
130
+ const variableDefinitions = [
131
+ t.variableDefinition({
132
+ variable: t.variable({ name: 'first' }),
133
+ type: t.namedType({ type: 'Int' }),
134
+ }),
135
+ t.variableDefinition({
136
+ variable: t.variable({ name: 'last' }),
137
+ type: t.namedType({ type: 'Int' }),
138
+ }),
139
+ t.variableDefinition({
140
+ variable: t.variable({ name: 'after' }),
141
+ type: t.namedType({ type: 'Cursor' }),
142
+ }),
143
+ t.variableDefinition({
144
+ variable: t.variable({ name: 'before' }),
145
+ type: t.namedType({ type: 'Cursor' }),
146
+ }),
147
+ t.variableDefinition({
148
+ variable: t.variable({ name: 'offset' }),
149
+ type: t.namedType({ type: 'Int' }),
150
+ }),
151
+ t.variableDefinition({
152
+ variable: t.variable({ name: 'condition' }),
153
+ type: t.namedType({ type: Condition }),
154
+ }),
155
+ t.variableDefinition({
156
+ variable: t.variable({ name: 'filter' }),
157
+ type: t.namedType({ type: Filter }),
158
+ }),
159
+ t.variableDefinition({
160
+ variable: t.variable({ name: 'orderBy' }),
161
+ type: t.listType({
162
+ type: t.nonNullType({ type: t.namedType({ type: OrderBy }) }),
163
+ }),
164
+ }),
165
+ ];
166
+ const args = [
167
+ t.argument({ name: 'first', value: t.variable({ name: 'first' }) }),
168
+ t.argument({ name: 'last', value: t.variable({ name: 'last' }) }),
169
+ t.argument({ name: 'offset', value: t.variable({ name: 'offset' }) }),
170
+ t.argument({ name: 'after', value: t.variable({ name: 'after' }) }),
171
+ t.argument({ name: 'before', value: t.variable({ name: 'before' }) }),
172
+ t.argument({
173
+ name: 'condition',
174
+ value: t.variable({ name: 'condition' }),
175
+ }),
176
+ t.argument({ name: 'filter', value: t.variable({ name: 'filter' }) }),
177
+ t.argument({ name: 'orderBy', value: t.variable({ name: 'orderBy' }) }),
178
+ ];
179
+ const pageInfoFields = [
180
+ t.field({ name: 'hasNextPage' }),
181
+ t.field({ name: 'hasPreviousPage' }),
182
+ t.field({ name: 'endCursor' }),
183
+ t.field({ name: 'startCursor' }),
184
+ ];
185
+ const dataField = builder?._edges
186
+ ? t.field({
187
+ name: 'edges',
188
+ selectionSet: t.selectionSet({
189
+ selections: [
190
+ t.field({ name: 'cursor' }),
191
+ t.field({
192
+ name: 'node',
193
+ selectionSet: t.selectionSet({ selections }),
194
+ }),
195
+ ],
196
+ }),
197
+ })
198
+ : t.field({
199
+ name: 'nodes',
200
+ selectionSet: t.selectionSet({ selections }),
201
+ });
202
+ const connectionFields = [
203
+ t.field({ name: 'totalCount' }),
204
+ t.field({
205
+ name: 'pageInfo',
206
+ selectionSet: t.selectionSet({ selections: pageInfoFields }),
207
+ }),
208
+ dataField,
209
+ ];
210
+ const ast = t.document({
211
+ definitions: [
212
+ t.operationDefinition({
213
+ operation: 'query',
214
+ name: queryName,
215
+ variableDefinitions,
216
+ selectionSet: t.selectionSet({
217
+ selections: [
218
+ t.field({
219
+ name: operationName,
220
+ args,
221
+ selectionSet: t.selectionSet({ selections: connectionFields }),
222
+ }),
223
+ ],
224
+ }),
225
+ }),
226
+ ],
227
+ });
228
+ return ast;
229
+ };
230
+ export const getOne = ({ queryName, operationName, query, selection, }) => {
231
+ const variableDefinitions = Object.keys(query.properties)
232
+ .map((key) => ({ key, ...query.properties[key] }))
233
+ .filter((field) => field.isNotNull)
234
+ .map((field) => {
235
+ const { key: fieldName, type: fieldType, isNotNull, isArray, isArrayNotNull, } = field;
236
+ let type = t.namedType({ type: fieldType });
237
+ if (isNotNull)
238
+ type = t.nonNullType({ type });
239
+ if (isArray) {
240
+ type = t.listType({ type });
241
+ if (isArrayNotNull)
242
+ type = t.nonNullType({ type });
243
+ }
244
+ return t.variableDefinition({
245
+ variable: t.variable({ name: fieldName }),
246
+ type,
247
+ });
248
+ });
249
+ const props = objectToArray(query.properties);
250
+ const selectArgs = props
251
+ .filter((field) => field.isNotNull)
252
+ .map((field) => {
253
+ return t.argument({
254
+ name: field.name,
255
+ value: t.variable({ name: field.name }),
256
+ });
257
+ });
258
+ const selections = getSelections(selection);
259
+ const opSel = [
260
+ t.field({
261
+ name: operationName,
262
+ args: selectArgs,
263
+ selectionSet: t.selectionSet({ selections }),
264
+ }),
265
+ ];
266
+ const ast = t.document({
267
+ definitions: [
268
+ t.operationDefinition({
269
+ operation: 'query',
270
+ name: queryName,
271
+ variableDefinitions,
272
+ selectionSet: t.selectionSet({ selections: opSel }),
273
+ }),
274
+ ],
275
+ });
276
+ return ast;
277
+ };
278
+ export const createOne = ({ mutationName, operationName, mutation, selection, }) => {
279
+ if (!mutation.properties?.input?.properties) {
280
+ throw new Error(`No input field for mutation: ${mutationName}`);
281
+ }
282
+ const modelName = inflection.camelize([inflection.singularize(mutation.model)].join('_'), true);
283
+ const inputProperties = mutation.properties.input
284
+ .properties;
285
+ const modelProperties = inputProperties[modelName];
286
+ if (!modelProperties.properties) {
287
+ throw new Error(`No properties found for model: ${modelName}`);
288
+ }
289
+ const allAttrs = objectToArray(modelProperties.properties);
290
+ const attrs = allAttrs.filter((field) => !NON_MUTABLE_PROPS.includes(field.name));
291
+ const variableDefinitions = getCreateVariablesAst(attrs);
292
+ const selectArgs = [
293
+ t.argument({
294
+ name: 'input',
295
+ value: t.objectValue({
296
+ fields: [
297
+ t.objectField({
298
+ name: modelName,
299
+ value: t.objectValue({
300
+ fields: attrs.map((field) => t.objectField({
301
+ name: field.name,
302
+ value: t.variable({ name: field.name }),
303
+ })),
304
+ }),
305
+ }),
306
+ ],
307
+ }),
308
+ }),
309
+ ];
310
+ const selections = selection
311
+ ? getSelections(selection)
312
+ : allAttrs.map((field) => t.field({ name: field.name }));
313
+ const ast = createGqlMutation({
314
+ operationName,
315
+ mutationName,
316
+ selectArgs,
317
+ selections,
318
+ variableDefinitions,
319
+ modelName,
320
+ });
321
+ return ast;
322
+ };
323
+ export const patchOne = ({ mutationName, operationName, mutation, selection, }) => {
324
+ if (!mutation.properties?.input?.properties) {
325
+ throw new Error(`No input field for mutation: ${mutationName}`);
326
+ }
327
+ const modelName = inflection.camelize([inflection.singularize(mutation.model)].join('_'), true);
328
+ const inputProperties = mutation.properties.input
329
+ .properties;
330
+ const patchProperties = inputProperties['patch'];
331
+ const allAttrs = patchProperties?.properties
332
+ ? objectToArray(patchProperties.properties)
333
+ : [];
334
+ const patchAttrs = allAttrs.filter((prop) => !NON_MUTABLE_PROPS.includes(prop.name));
335
+ const patchByAttrs = objectToArray(inputProperties).filter((n) => n.name !== 'patch');
336
+ const patchers = patchByAttrs.map((p) => p.name);
337
+ const variableDefinitions = getUpdateVariablesAst(patchAttrs, patchers);
338
+ const selectArgs = [
339
+ t.argument({
340
+ name: 'input',
341
+ value: t.objectValue({
342
+ fields: [
343
+ ...patchByAttrs.map((field) => t.objectField({
344
+ name: field.name,
345
+ value: t.variable({ name: field.name }),
346
+ })),
347
+ t.objectField({
348
+ name: 'patch',
349
+ value: t.objectValue({
350
+ fields: patchAttrs
351
+ .filter((field) => !patchers.includes(field.name))
352
+ .map((field) => t.objectField({
353
+ name: field.name,
354
+ value: t.variable({ name: field.name }),
355
+ })),
356
+ }),
357
+ }),
358
+ ],
359
+ }),
360
+ }),
361
+ ];
362
+ const selections = selection
363
+ ? getSelections(selection)
364
+ : allAttrs.map((field) => t.field({ name: field.name }));
365
+ const ast = createGqlMutation({
366
+ operationName,
367
+ mutationName,
368
+ selectArgs,
369
+ selections,
370
+ variableDefinitions,
371
+ modelName,
372
+ });
373
+ return ast;
374
+ };
375
+ export const deleteOne = ({ mutationName, operationName, mutation, }) => {
376
+ if (!mutation.properties?.input?.properties) {
377
+ throw new Error(`No input field for mutation: ${mutationName}`);
378
+ }
379
+ const modelName = inflection.camelize([inflection.singularize(mutation.model)].join('_'), true);
380
+ const inputProperties = mutation.properties.input
381
+ .properties;
382
+ const deleteAttrs = objectToArray(inputProperties);
383
+ const variableDefinitions = deleteAttrs.map((field) => {
384
+ const { name: fieldName, type: fieldType, isNotNull, isArray } = field;
385
+ let type = t.namedType({ type: fieldType });
386
+ if (isNotNull)
387
+ type = t.nonNullType({ type });
388
+ if (isArray) {
389
+ type = t.listType({ type });
390
+ // no need to check isArrayNotNull since we need this field for deletion
391
+ type = t.nonNullType({ type });
392
+ }
393
+ return t.variableDefinition({
394
+ variable: t.variable({ name: fieldName }),
395
+ type,
396
+ });
397
+ });
398
+ const selectArgs = [
399
+ t.argument({
400
+ name: 'input',
401
+ value: t.objectValue({
402
+ fields: deleteAttrs.map((f) => t.objectField({
403
+ name: f.name,
404
+ value: t.variable({ name: f.name }),
405
+ })),
406
+ }),
407
+ }),
408
+ ];
409
+ // so we can support column select grants plugin
410
+ const selections = [t.field({ name: 'clientMutationId' })];
411
+ const ast = createGqlMutation({
412
+ operationName,
413
+ mutationName,
414
+ selectArgs,
415
+ selections,
416
+ useModel: false,
417
+ variableDefinitions,
418
+ modelName,
419
+ });
420
+ return ast;
421
+ };
422
+ export function getSelections(selection = []) {
423
+ const selectionAst = (field) => {
424
+ if (typeof field === 'string') {
425
+ return t.field({ name: field });
426
+ }
427
+ // Check if fieldDefn has MetaField shape (has type.pgType)
428
+ const fieldDefn = field.fieldDefn;
429
+ if (fieldDefn &&
430
+ 'type' in fieldDefn &&
431
+ fieldDefn.type &&
432
+ typeof fieldDefn.type === 'object' &&
433
+ 'pgType' in fieldDefn.type) {
434
+ const customAst = getCustomAst(fieldDefn);
435
+ if (customAst)
436
+ return customAst;
437
+ }
438
+ return t.field({ name: field.name });
439
+ };
440
+ return selection
441
+ .map((selectionDefn) => {
442
+ if (selectionDefn.isObject) {
443
+ const { name, selection, variables = {}, isBelongTo } = selectionDefn;
444
+ const args = Object.entries(variables).reduce((acc, variable) => {
445
+ const [argName, argValue] = variable;
446
+ const argAst = t.argument({
447
+ name: argName,
448
+ value: getComplexValueAst(argValue),
449
+ });
450
+ return argAst ? [...acc, argAst] : acc;
451
+ }, []);
452
+ const subSelections = selection?.map((field) => selectionAst(field)) || [];
453
+ const selectionSet = isBelongTo
454
+ ? t.selectionSet({ selections: subSelections })
455
+ : t.selectionSet({
456
+ selections: [
457
+ t.field({ name: 'totalCount' }),
458
+ t.field({
459
+ name: 'nodes',
460
+ selectionSet: t.selectionSet({ selections: subSelections }),
461
+ }),
462
+ ],
463
+ });
464
+ return t.field({
465
+ name,
466
+ args,
467
+ selectionSet,
468
+ });
469
+ }
470
+ else {
471
+ return selectionAst(selectionDefn);
472
+ }
473
+ })
474
+ .filter((node) => node !== null);
475
+ }
476
+ function getComplexValueAst(value) {
477
+ // Handle null
478
+ if (value === null) {
479
+ return t.nullValue();
480
+ }
481
+ // Handle primitives
482
+ if (typeof value === 'boolean') {
483
+ return t.booleanValue({ value });
484
+ }
485
+ if (typeof value === 'number') {
486
+ return t.intValue({ value: value.toString() });
487
+ }
488
+ if (typeof value === 'string') {
489
+ return t.stringValue({ value });
490
+ }
491
+ // Handle arrays
492
+ if (Array.isArray(value)) {
493
+ return t.listValue({
494
+ values: value.map((item) => getComplexValueAst(item)),
495
+ });
496
+ }
497
+ // Handle objects
498
+ if (typeof value === 'object' && value !== null) {
499
+ const obj = value;
500
+ return t.objectValue({
501
+ fields: Object.entries(obj).map(([key, val]) => t.objectField({
502
+ name: key,
503
+ value: getComplexValueAst(val),
504
+ })),
505
+ });
506
+ }
507
+ throw new Error(`Unsupported value type: ${typeof value}`);
508
+ }
509
+ function getCreateVariablesAst(attrs) {
510
+ return attrs.map((field) => {
511
+ const { name: fieldName, type: fieldType, isNotNull, isArray, isArrayNotNull, } = field;
512
+ let type = t.namedType({ type: fieldType });
513
+ if (isNotNull)
514
+ type = t.nonNullType({ type });
515
+ if (isArray) {
516
+ type = t.listType({ type });
517
+ if (isArrayNotNull)
518
+ type = t.nonNullType({ type });
519
+ }
520
+ return t.variableDefinition({
521
+ variable: t.variable({ name: fieldName }),
522
+ type,
523
+ });
524
+ });
525
+ }
526
+ function getUpdateVariablesAst(attrs, patchers) {
527
+ const patchVariables = attrs
528
+ .filter((field) => !patchers.includes(field.name))
529
+ .map((field) => {
530
+ const { name: fieldName, type: fieldType, isArray, isArrayNotNull } = field;
531
+ let type = t.namedType({ type: fieldType });
532
+ if (isArray) {
533
+ type = t.listType({ type });
534
+ if (isArrayNotNull)
535
+ type = t.nonNullType({ type });
536
+ }
537
+ return t.variableDefinition({
538
+ variable: t.variable({ name: fieldName }),
539
+ type,
540
+ });
541
+ });
542
+ const patcherVariables = patchers.map((patcher) => {
543
+ return t.variableDefinition({
544
+ variable: t.variable({ name: patcher }),
545
+ type: t.nonNullType({ type: t.namedType({ type: 'String' }) }),
546
+ });
547
+ });
548
+ return [...patchVariables, ...patcherVariables];
549
+ }
@@ -0,0 +1,35 @@
1
+ import type { FieldNode } from 'graphql';
2
+ import type { CleanField } from '../types/schema';
3
+ import type { MetaField } from './types';
4
+ /**
5
+ * Get custom AST for MetaField type - handles PostgreSQL types that need subfield selections
6
+ */
7
+ export declare function getCustomAst(fieldDefn?: MetaField): FieldNode | null;
8
+ /**
9
+ * Generate custom AST for CleanField type - handles GraphQL types that need subfield selections
10
+ */
11
+ export declare function getCustomAstForCleanField(field: CleanField): FieldNode;
12
+ /**
13
+ * Check if a CleanField requires subfield selection based on its GraphQL type
14
+ */
15
+ export declare function requiresSubfieldSelection(field: CleanField): boolean;
16
+ /**
17
+ * Generate AST for GeometryPoint type
18
+ */
19
+ export declare function geometryPointAst(name: string): FieldNode;
20
+ /**
21
+ * Generate AST for GeometryGeometryCollection type
22
+ */
23
+ export declare function geometryCollectionAst(name: string): FieldNode;
24
+ /**
25
+ * Generate AST for generic geometry type (returns geojson)
26
+ */
27
+ export declare function geometryAst(name: string): FieldNode;
28
+ /**
29
+ * Generate AST for interval type
30
+ */
31
+ export declare function intervalAst(name: string): FieldNode;
32
+ /**
33
+ * Check if an object has interval type shape
34
+ */
35
+ export declare function isIntervalType(obj: unknown): boolean;