joist-graphql-codegen 2.3.0-next.41 → 2.3.0-next.43

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 (125) hide show
  1. package/build/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/build/generateEnumDetailResolvers.cjs +40 -0
  3. package/build/generateEnumDetailResolvers.cjs.map +1 -0
  4. package/build/generateEnumDetailResolvers.d.cts +8 -0
  5. package/build/generateEnumDetailResolvers.d.cts.map +1 -0
  6. package/build/generateEnumDetailResolvers.d.mts +8 -0
  7. package/build/generateEnumDetailResolvers.d.mts.map +1 -0
  8. package/build/generateEnumDetailResolvers.js +23 -23
  9. package/build/generateEnumDetailResolvers.js.map +1 -1
  10. package/build/generateEnumsGraphql.cjs +29 -0
  11. package/build/generateEnumsGraphql.cjs.map +1 -0
  12. package/build/generateEnumsGraphql.d.cts +8 -0
  13. package/build/generateEnumsGraphql.d.cts.map +1 -0
  14. package/build/generateEnumsGraphql.d.mts +8 -0
  15. package/build/generateEnumsGraphql.d.mts.map +1 -0
  16. package/build/generateEnumsGraphql.js +24 -27
  17. package/build/generateEnumsGraphql.js.map +1 -1
  18. package/build/generateGraphqlCodegen.cjs +54 -0
  19. package/build/generateGraphqlCodegen.cjs.map +1 -0
  20. package/build/generateGraphqlCodegen.d.cts +8 -0
  21. package/build/generateGraphqlCodegen.d.cts.map +1 -0
  22. package/build/generateGraphqlCodegen.d.mts +8 -0
  23. package/build/generateGraphqlCodegen.d.mts.map +1 -0
  24. package/build/generateGraphqlCodegen.js +28 -30
  25. package/build/generateGraphqlCodegen.js.map +1 -1
  26. package/build/generateGraphqlSchemaFiles.cjs +491 -0
  27. package/build/generateGraphqlSchemaFiles.cjs.map +1 -0
  28. package/build/{generateGraphqlSchemaFiles.d.ts → generateGraphqlSchemaFiles.d.cts} +6 -2
  29. package/build/generateGraphqlSchemaFiles.d.cts.map +1 -0
  30. package/build/generateGraphqlSchemaFiles.d.mts +15 -0
  31. package/build/generateGraphqlSchemaFiles.d.mts.map +1 -0
  32. package/build/generateGraphqlSchemaFiles.js +444 -286
  33. package/build/generateGraphqlSchemaFiles.js.map +1 -1
  34. package/build/generateObjectResolvers.cjs +70 -0
  35. package/build/generateObjectResolvers.cjs.map +1 -0
  36. package/build/{generateObjectResolvers.d.ts → generateObjectResolvers.d.cts} +5 -1
  37. package/build/generateObjectResolvers.d.cts.map +1 -0
  38. package/build/generateObjectResolvers.d.mts +17 -0
  39. package/build/generateObjectResolvers.d.mts.map +1 -0
  40. package/build/generateObjectResolvers.js +48 -38
  41. package/build/generateObjectResolvers.js.map +1 -1
  42. package/build/generateQueryPageResolvers.cjs +51 -0
  43. package/build/generateQueryPageResolvers.cjs.map +1 -0
  44. package/build/generateQueryPageResolvers.d.cts +8 -0
  45. package/build/generateQueryPageResolvers.d.cts.map +1 -0
  46. package/build/generateQueryPageResolvers.d.mts +8 -0
  47. package/build/generateQueryPageResolvers.d.mts.map +1 -0
  48. package/build/generateQueryPageResolvers.js +31 -35
  49. package/build/generateQueryPageResolvers.js.map +1 -1
  50. package/build/generateQueryResolvers.cjs +55 -0
  51. package/build/generateQueryResolvers.cjs.map +1 -0
  52. package/build/generateQueryResolvers.d.cts +10 -0
  53. package/build/generateQueryResolvers.d.cts.map +1 -0
  54. package/build/generateQueryResolvers.d.mts +10 -0
  55. package/build/generateQueryResolvers.d.mts.map +1 -0
  56. package/build/generateQueryResolvers.js +38 -36
  57. package/build/generateQueryResolvers.js.map +1 -1
  58. package/build/generateResolverUtils.cjs +36 -0
  59. package/build/generateResolverUtils.cjs.map +1 -0
  60. package/build/generateResolverUtils.d.cts +8 -0
  61. package/build/generateResolverUtils.d.cts.map +1 -0
  62. package/build/generateResolverUtils.d.mts +8 -0
  63. package/build/generateResolverUtils.d.mts.map +1 -0
  64. package/build/generateResolverUtils.js +25 -26
  65. package/build/generateResolverUtils.js.map +1 -1
  66. package/build/generateSaveResolvers.cjs +57 -0
  67. package/build/generateSaveResolvers.cjs.map +1 -0
  68. package/build/{generateSaveResolvers.d.ts → generateSaveResolvers.d.cts} +5 -1
  69. package/build/generateSaveResolvers.d.cts.map +1 -0
  70. package/build/generateSaveResolvers.d.mts +17 -0
  71. package/build/generateSaveResolvers.d.mts.map +1 -0
  72. package/build/generateSaveResolvers.js +39 -40
  73. package/build/generateSaveResolvers.js.map +1 -1
  74. package/build/graphqlUtils.cjs +160 -0
  75. package/build/graphqlUtils.cjs.map +1 -0
  76. package/build/graphqlUtils.d.cts +31 -0
  77. package/build/graphqlUtils.d.cts.map +1 -0
  78. package/build/graphqlUtils.d.mts +31 -0
  79. package/build/graphqlUtils.d.mts.map +1 -0
  80. package/build/graphqlUtils.js +120 -218
  81. package/build/graphqlUtils.js.map +1 -1
  82. package/build/history.cjs +25 -0
  83. package/build/history.cjs.map +1 -0
  84. package/build/history.d.cts +9 -0
  85. package/build/history.d.cts.map +1 -0
  86. package/build/history.d.mts +9 -0
  87. package/build/history.d.mts.map +1 -0
  88. package/build/history.js +17 -14
  89. package/build/history.js.map +1 -1
  90. package/build/index.cjs +57 -0
  91. package/build/index.cjs.map +1 -0
  92. package/build/index.d.cts +7 -0
  93. package/build/index.d.cts.map +1 -0
  94. package/build/index.d.mts +7 -0
  95. package/build/index.d.mts.map +1 -0
  96. package/build/index.js +48 -54
  97. package/build/index.js.map +1 -1
  98. package/build/testUtils.cjs +181 -0
  99. package/build/testUtils.cjs.map +1 -0
  100. package/build/testUtils.d.cts +20 -0
  101. package/build/testUtils.d.cts.map +1 -0
  102. package/build/testUtils.d.mts +20 -0
  103. package/build/testUtils.d.mts.map +1 -0
  104. package/build/testUtils.js +152 -158
  105. package/build/testUtils.js.map +1 -1
  106. package/build/utils.cjs +51 -0
  107. package/build/utils.cjs.map +1 -0
  108. package/build/utils.d.cts +16 -0
  109. package/build/utils.d.cts.map +1 -0
  110. package/build/utils.d.mts +16 -0
  111. package/build/utils.d.mts.map +1 -0
  112. package/build/utils.js +37 -49
  113. package/build/utils.js.map +1 -1
  114. package/package.json +28 -5
  115. package/build/generateEnumDetailResolvers.d.ts +0 -4
  116. package/build/generateEnumsGraphql.d.ts +0 -4
  117. package/build/generateGraphqlCodegen.d.ts +0 -4
  118. package/build/generateQueryPageResolvers.d.ts +0 -4
  119. package/build/generateQueryResolvers.d.ts +0 -6
  120. package/build/generateResolverUtils.d.ts +0 -4
  121. package/build/graphqlUtils.d.ts +0 -27
  122. package/build/history.d.ts +0 -5
  123. package/build/index.d.ts +0 -3
  124. package/build/testUtils.d.ts +0 -24
  125. package/build/utils.d.ts +0 -12
@@ -0,0 +1,491 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
3
+ require("./utils.cjs");
4
+ const require_graphqlUtils = require("./graphqlUtils.cjs");
5
+ const require_history = require("./history.cjs");
6
+ let change_case = require("change-case");
7
+ require("joist-codegen");
8
+ let pluralize = require("pluralize");
9
+ pluralize = require_runtime.__toESM(pluralize, 1);
10
+ let joist_utils = require("joist-utils");
11
+ //#region src/generateGraphqlSchemaFiles.ts
12
+ /**
13
+ * Generates `*.graphql` files based on the database schema.
14
+ *
15
+ * This follows an "evergreen" approach where we upsert changes into files that are also
16
+ * hand-modified by the programmer. We remember what insertions we've made in a history file,
17
+ * and will only do them once, which allows programmers to manually add/edit/remove fields
18
+ * without this stomping over their changes.
19
+ */
20
+ async function generateGraphqlSchemaFiles(config, fs, dbMeta) {
21
+ const { entities } = dbMeta;
22
+ const fields = [
23
+ ...createPageInfoFields(config),
24
+ ...createQueryFields(config, entities),
25
+ ...createSaveMutation(entities),
26
+ ...createEntityFields(dbMeta),
27
+ ...createFilterFields(dbMeta),
28
+ ...createSaveEntityInputFields(dbMeta),
29
+ ...createSaveEntityResultFields(entities)
30
+ ];
31
+ const unions = createPolymorphicUnions(entities);
32
+ const history = await require_history.loadHistory(fs);
33
+ const newEntries = [...fields.filter(({ objectName, fieldName }) => !history[objectName]?.includes(fieldName)), ...unions.filter(({ objectName, types }) => {
34
+ const set = new Set(history[objectName] ?? []);
35
+ return !(set.size === types.length && types.every((type) => set.has(type)));
36
+ })];
37
+ if (newEntries.length === 0) return;
38
+ await Promise.all(Object.entries((0, joist_utils.groupBy)(newEntries, (f) => f.file)).map(([file, fields]) => {
39
+ return require_graphqlUtils.upsertIntoFile(fs, file, fields);
40
+ }));
41
+ newEntries.forEach((entry) => {
42
+ if (entry.objectType === "union") {
43
+ const { objectName, types } = entry;
44
+ history[objectName] = types;
45
+ } else {
46
+ const { objectName, fieldName } = entry;
47
+ const fields = history[objectName] = history[objectName] || [];
48
+ if (!fields.includes(fieldName)) fields.push(fieldName);
49
+ }
50
+ });
51
+ await require_history.writeHistory(fs, history);
52
+ }
53
+ /** Makes the project's pagination metadata type. */
54
+ function createPageInfoFields(config) {
55
+ const common = {
56
+ file: "pageInfo.graphql",
57
+ objectType: "output",
58
+ objectName: "PageInfo"
59
+ };
60
+ const shared = [
61
+ {
62
+ ...common,
63
+ fieldName: "hasNextPage",
64
+ fieldType: "Boolean!"
65
+ },
66
+ {
67
+ ...common,
68
+ fieldName: "hasPreviousPage",
69
+ fieldType: "Boolean!"
70
+ },
71
+ {
72
+ ...common,
73
+ fieldName: "totalCount",
74
+ fieldType: "Int!"
75
+ }
76
+ ];
77
+ if ((config.paginationStyle ?? "cursor") === "limit") return [
78
+ ...shared,
79
+ {
80
+ ...common,
81
+ fieldName: "nextPage",
82
+ fieldType: "Int"
83
+ },
84
+ {
85
+ ...common,
86
+ fieldName: "currentPage",
87
+ fieldType: "Int"
88
+ }
89
+ ];
90
+ return [
91
+ ...shared,
92
+ {
93
+ ...common,
94
+ fieldName: "startCursor",
95
+ fieldType: "String"
96
+ },
97
+ {
98
+ ...common,
99
+ fieldName: "endCursor",
100
+ fieldType: "String"
101
+ }
102
+ ];
103
+ }
104
+ /** Make all the fields for `type Author`, `type Book`, etc. */
105
+ function createPolymorphicUnions(entities) {
106
+ return entities.flatMap((e) => {
107
+ const file = fileName(e);
108
+ return e.polymorphics.map(({ fieldType, components }) => {
109
+ return {
110
+ file,
111
+ objectType: "union",
112
+ objectName: fieldType,
113
+ types: components.map((c) => c.otherEntity.name)
114
+ };
115
+ });
116
+ });
117
+ }
118
+ /** Make all the fields for `type Author`, `type Book`, etc. */
119
+ function createEntityFields(dbMeta) {
120
+ const { entities } = dbMeta;
121
+ return entities.flatMap((e) => {
122
+ const common = {
123
+ file: fileName(e),
124
+ objectType: "output",
125
+ objectName: e.entity.name
126
+ };
127
+ const id = {
128
+ ...common,
129
+ fieldName: "id",
130
+ fieldType: "ID!"
131
+ };
132
+ const primitives = e.primitives.flatMap(({ fieldName, fieldType: tsType, isArray, notNull }) => {
133
+ const fieldType = primitiveFieldType(fieldName, tsType, isArray, notNull);
134
+ if (!fieldType) return [];
135
+ return [{
136
+ ...common,
137
+ fieldName,
138
+ fieldType
139
+ }];
140
+ });
141
+ const enums = e.enums.map(({ fieldName, enumType, notNull, isArray }) => {
142
+ const fieldType = isArray ? `[${enumType.symbol}!]!` : `${enumType.symbol}Detail${maybeRequired(notNull)}`;
143
+ return {
144
+ ...common,
145
+ fieldName,
146
+ fieldType
147
+ };
148
+ });
149
+ const pgEnums = e.pgEnums.map(({ fieldName, enumType, notNull }) => {
150
+ const fieldType = `${enumType.symbol}${maybeRequired(notNull)}`;
151
+ return {
152
+ ...common,
153
+ fieldName,
154
+ fieldType
155
+ };
156
+ });
157
+ const m2os = e.manyToOnes.map(({ fieldName, otherEntity, notNull }) => {
158
+ const other = dbMeta.entitiesByName[otherEntity.name];
159
+ const maybeLike = other.subTypes.length > 0 && !other.abstract ? "Like" : "";
160
+ const fieldType = `${otherEntity.name}${maybeLike}${maybeRequired(notNull)}`;
161
+ return {
162
+ ...common,
163
+ fieldName,
164
+ fieldType
165
+ };
166
+ });
167
+ const o2ms = e.oneToManys.map(({ fieldName, otherEntity }) => {
168
+ const fieldType = `[${otherEntity.name}!]!`;
169
+ return {
170
+ ...common,
171
+ fieldName,
172
+ fieldType
173
+ };
174
+ });
175
+ const m2ms = e.manyToManys.map(({ fieldName, otherEntity }) => {
176
+ const fieldType = `[${otherEntity.name}!]!`;
177
+ return {
178
+ ...common,
179
+ fieldName,
180
+ fieldType
181
+ };
182
+ });
183
+ const o2os = e.oneToOnes.map(({ fieldName, otherEntity }) => {
184
+ return {
185
+ ...common,
186
+ fieldName,
187
+ fieldType: otherEntity.name
188
+ };
189
+ });
190
+ const polys = e.polymorphics.map(({ fieldName, fieldType }) => {
191
+ return {
192
+ ...common,
193
+ fieldName,
194
+ fieldType
195
+ };
196
+ });
197
+ return [
198
+ id,
199
+ ...e.baseClassName ? createEntityFields(findBaseEntity(dbMeta, e.baseClassName)).map((f) => ({
200
+ ...f,
201
+ ...common
202
+ })).filter((f) => f.fieldName !== "id") : [],
203
+ ...primitives,
204
+ ...enums,
205
+ ...pgEnums,
206
+ ...m2os,
207
+ ...o2ms,
208
+ ...m2ms,
209
+ ...o2os,
210
+ ...polys
211
+ ];
212
+ });
213
+ }
214
+ /** Makes the `Mutations.save${entity}` placeholder. */
215
+ function createSaveMutation(entities) {
216
+ return entities.map((e) => {
217
+ const file = fileName(e);
218
+ const inputType = `Save${e.entity.name}Input`;
219
+ const outputType = `Save${e.entity.name}Result`;
220
+ return {
221
+ file,
222
+ objectType: "output",
223
+ objectName: "Mutation",
224
+ fieldName: `save${e.entity.name}`,
225
+ fieldType: `${outputType}!`,
226
+ argsString: `input: ${inputType}!`,
227
+ extends: true
228
+ };
229
+ });
230
+ }
231
+ /** Makes the `Query.${entity}` and `Query.${entity}s` placeholders. */
232
+ function createQueryFields(config, entities) {
233
+ return entities.flatMap((e) => {
234
+ const file = fileName(e);
235
+ const { name } = e.entity;
236
+ const pluralName = (0, pluralize.default)(name);
237
+ const camelName = (0, change_case.camelCase)(name);
238
+ const pluralCamelName = (0, pluralize.default)(camelName);
239
+ const collectionType = (config.paginationStyle ?? "cursor") === "limit" ? `${pluralName}Page!` : `${pluralName}Connection!`;
240
+ const collectionArgs = (config.paginationStyle ?? "cursor") === "limit" ? `filter: ${name}Filter, limit: Int, offset: Int` : `filter: ${name}Filter, first: Int, after: String, last: Int, before: String`;
241
+ return [
242
+ {
243
+ file,
244
+ objectType: "output",
245
+ objectName: "Query",
246
+ fieldName: camelName,
247
+ fieldType: `${name}!`,
248
+ argsString: `id: ID!`,
249
+ extends: true
250
+ },
251
+ {
252
+ file,
253
+ objectType: "output",
254
+ objectName: "Query",
255
+ fieldName: pluralCamelName,
256
+ fieldType: collectionType,
257
+ argsString: collectionArgs,
258
+ extends: true
259
+ },
260
+ ...createPaginationTypes(config, file, e)
261
+ ];
262
+ });
263
+ }
264
+ /** Makes the `AuthorFilter`, `BookFilter`, etc. input types. */
265
+ function createFilterFields(dbMeta) {
266
+ const { entities } = dbMeta;
267
+ return entities.flatMap((e) => {
268
+ const common = {
269
+ file: fileName(e),
270
+ objectType: "input",
271
+ objectName: `${e.entity.name}Filter`
272
+ };
273
+ const id = {
274
+ ...common,
275
+ fieldName: "id",
276
+ fieldType: filterListType("ID")
277
+ };
278
+ const primitives = e.primitives.flatMap(({ fieldName, fieldType: tsType, isArray }) => {
279
+ const fieldType = primitiveFieldType(fieldName, tsType, isArray);
280
+ if (!fieldType) return [];
281
+ return [{
282
+ ...common,
283
+ fieldName,
284
+ fieldType: filterListType(fieldType)
285
+ }];
286
+ });
287
+ const enums = e.enums.map(({ fieldName, enumType, isArray }) => {
288
+ const fieldType = isArray ? `[${enumType.symbol}!]` : enumType.symbol;
289
+ return {
290
+ ...common,
291
+ fieldName,
292
+ fieldType: filterListType(fieldType)
293
+ };
294
+ });
295
+ const pgEnums = e.pgEnums.map(({ fieldName, enumType }) => {
296
+ return {
297
+ ...common,
298
+ fieldName,
299
+ fieldType: filterListType(enumType.symbol)
300
+ };
301
+ });
302
+ const m2os = e.manyToOnes.map(({ fieldName }) => {
303
+ return {
304
+ ...common,
305
+ fieldName: `${fieldName}Id`,
306
+ fieldType: filterListType("ID")
307
+ };
308
+ });
309
+ const polys = e.polymorphics.map(({ fieldName }) => {
310
+ return {
311
+ ...common,
312
+ fieldName: `${fieldName}Id`,
313
+ fieldType: filterListType("ID")
314
+ };
315
+ });
316
+ return [
317
+ id,
318
+ ...e.baseClassName ? createFilterFields(findBaseEntity(dbMeta, e.baseClassName)).map((f) => ({
319
+ ...f,
320
+ ...common
321
+ })).filter((f) => f.fieldName !== "id") : [],
322
+ ...primitives,
323
+ ...enums,
324
+ ...pgEnums,
325
+ ...m2os,
326
+ ...polys
327
+ ];
328
+ });
329
+ }
330
+ /** Makes the page/connection types for `Query.authors`. */
331
+ function createPaginationTypes(config, file, e) {
332
+ const { name } = e.entity;
333
+ const pluralName = (0, pluralize.default)(name);
334
+ const objectType = "output";
335
+ if ((config.paginationStyle ?? "cursor") === "limit") return [{
336
+ file,
337
+ objectType,
338
+ objectName: `${pluralName}Page`,
339
+ fieldName: "entities",
340
+ fieldType: `[${name}!]!`
341
+ }, {
342
+ file,
343
+ objectType,
344
+ objectName: `${pluralName}Page`,
345
+ fieldName: "pageInfo",
346
+ fieldType: "PageInfo!"
347
+ }];
348
+ return [
349
+ {
350
+ file,
351
+ objectType,
352
+ objectName: `${pluralName}Connection`,
353
+ fieldName: "edges",
354
+ fieldType: `[${pluralName}Edge!]!`
355
+ },
356
+ {
357
+ file,
358
+ objectType,
359
+ objectName: `${pluralName}Connection`,
360
+ fieldName: "nodes",
361
+ fieldType: `[${name}!]!`
362
+ },
363
+ {
364
+ file,
365
+ objectType,
366
+ objectName: `${pluralName}Connection`,
367
+ fieldName: "pageInfo",
368
+ fieldType: "PageInfo!"
369
+ },
370
+ {
371
+ file,
372
+ objectType,
373
+ objectName: `${pluralName}Edge`,
374
+ fieldName: "node",
375
+ fieldType: `${name}!`
376
+ },
377
+ {
378
+ file,
379
+ objectType,
380
+ objectName: `${pluralName}Edge`,
381
+ fieldName: "cursor",
382
+ fieldType: "String!"
383
+ }
384
+ ];
385
+ }
386
+ /** Make all the fields for `type SaveAuthorInput`, `type SaveBookBook`, etc. */
387
+ function createSaveEntityInputFields(dbMeta) {
388
+ const { entities } = dbMeta;
389
+ return entities.flatMap((e) => {
390
+ const common = {
391
+ file: fileName(e),
392
+ objectType: "input",
393
+ objectName: `Save${e.entity.name}Input`
394
+ };
395
+ const id = {
396
+ ...common,
397
+ fieldName: "id",
398
+ fieldType: "ID"
399
+ };
400
+ const primitives = e.primitives.filter((f) => f.derived === false).flatMap(({ fieldName, fieldType: tsType, isArray }) => {
401
+ const fieldType = primitiveFieldType(fieldName, tsType, isArray);
402
+ if (!fieldType) return [];
403
+ return [{
404
+ ...common,
405
+ fieldName,
406
+ fieldType
407
+ }];
408
+ });
409
+ const enums = e.enums.map(({ fieldName, enumType, isArray }) => {
410
+ return {
411
+ ...common,
412
+ fieldName,
413
+ fieldType: isArray ? `[${enumType.symbol}!]` : enumType.symbol
414
+ };
415
+ });
416
+ const pgEnums = e.pgEnums.map(({ fieldName, enumType }) => {
417
+ return {
418
+ ...common,
419
+ fieldName,
420
+ fieldType: enumType.symbol
421
+ };
422
+ });
423
+ const m2os = e.manyToOnes.map(({ fieldName }) => {
424
+ return {
425
+ ...common,
426
+ fieldName: `${fieldName}Id`,
427
+ fieldType: "ID"
428
+ };
429
+ });
430
+ const polys = e.polymorphics.map(({ fieldName }) => {
431
+ return {
432
+ ...common,
433
+ fieldName: `${fieldName}Id`,
434
+ fieldType: "ID"
435
+ };
436
+ });
437
+ return [
438
+ id,
439
+ ...e.baseClassName ? createSaveEntityInputFields(findBaseEntity(dbMeta, e.baseClassName)).map((f) => ({
440
+ ...f,
441
+ ...common
442
+ })).filter((f) => f.fieldName !== "id") : [],
443
+ ...primitives,
444
+ ...enums,
445
+ ...pgEnums,
446
+ ...m2os,
447
+ ...polys
448
+ ];
449
+ });
450
+ }
451
+ /** Makes the fields for `type SaveAuthorResult`, `type SaveBookResult`, etc. */
452
+ function createSaveEntityResultFields(entities) {
453
+ return entities.flatMap((e) => {
454
+ const file = fileName(e);
455
+ const { entity: { name } } = e;
456
+ return [{
457
+ file,
458
+ objectType: "output",
459
+ objectName: `Save${name}Result`,
460
+ fieldName: (0, change_case.camelCase)(name),
461
+ fieldType: `${name}!`
462
+ }];
463
+ });
464
+ }
465
+ function maybeRequired(notNull) {
466
+ return notNull ? "!" : "";
467
+ }
468
+ /** Returns the GraphQL type for primitive fields, including primitive arrays. */
469
+ function primitiveFieldType(fieldName, tsType, isArray, notNull = false) {
470
+ const gqlType = require_graphqlUtils.mapTypescriptTypeToGraphQLType(fieldName, tsType);
471
+ if (!gqlType) return void 0;
472
+ return `${isArray ? `[${gqlType}!]` : gqlType}${maybeRequired(notNull)}`;
473
+ }
474
+ /** Wraps filter fields in lists so GraphQL callers can pass one value or OR several values. */
475
+ function filterListType(fieldType) {
476
+ return `[${fieldType}!]`;
477
+ }
478
+ /** I.e. `Book` --> `books.graphql`. */
479
+ function fileName(e) {
480
+ return `${(0, change_case.camelCase)(e.entity.name)}.graphql`;
481
+ }
482
+ function findBaseEntity(dbMeta, baseClassName) {
483
+ return {
484
+ ...dbMeta,
485
+ entities: dbMeta.entities.filter((e) => e.entity.name === baseClassName)
486
+ };
487
+ }
488
+ //#endregion
489
+ exports.generateGraphqlSchemaFiles = generateGraphqlSchemaFiles;
490
+
491
+ //# sourceMappingURL=generateGraphqlSchemaFiles.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateGraphqlSchemaFiles.cjs","names":["loadHistory","groupBy","upsertIntoFile","writeHistory","camelCase","mapTypescriptTypeToGraphQLType"],"sources":["../src/generateGraphqlSchemaFiles.ts"],"sourcesContent":["import { camelCase } from \"change-case\";\nimport { type Config, type DbMetadata, type EntityDbMetadata } from \"joist-codegen\";\nimport { groupBy } from \"joist-utils\";\nimport pluralize from \"pluralize\";\n\nimport { type GqlField, type GqlUnion, mapTypescriptTypeToGraphQLType, upsertIntoFile } from \"./graphqlUtils.ts\";\nimport { loadHistory, writeHistory } from \"./history.ts\";\nimport { type Fs } from \"./utils.ts\";\n\n/**\n * Generates `*.graphql` files based on the database schema.\n *\n * This follows an \"evergreen\" approach where we upsert changes into files that are also\n * hand-modified by the programmer. We remember what insertions we've made in a history file,\n * and will only do them once, which allows programmers to manually add/edit/remove fields\n * without this stomping over their changes.\n */\nexport async function generateGraphqlSchemaFiles(config: Config, fs: Fs, dbMeta: DbMetadata): Promise<void> {\n const { entities } = dbMeta;\n // Generate the \"ideal\" fields based solely on the domain model\n const fields = [\n ...createPageInfoFields(config),\n ...createQueryFields(config, entities),\n ...createSaveMutation(entities),\n ...createEntityFields(dbMeta),\n ...createFilterFields(dbMeta),\n ...createSaveEntityInputFields(dbMeta),\n ...createSaveEntityResultFields(entities),\n ];\n\n const unions = createPolymorphicUnions(entities);\n\n // Load the history and filter out only \"new\" / not-yet-added-to-.graphql fields\n const history = await loadHistory(fs);\n const newEntries = [\n ...fields.filter(({ objectName, fieldName }) => !history[objectName]?.includes(fieldName)),\n ...unions.filter(({ objectName, types }) => {\n const set = new Set(history[objectName] ?? []);\n return !(set.size === types.length && types.every((type) => set.has(type)));\n }),\n ];\n if (newEntries.length === 0) {\n return;\n }\n\n // Update the `.graphql` files with our new types/fields\n await Promise.all(\n Object.entries(groupBy(newEntries, (f) => f.file)).map(([file, fields]) => {\n return upsertIntoFile(fs, file, fields);\n }),\n );\n\n // Record the current batch of fields back to the history file\n newEntries.forEach((entry) => {\n if (entry.objectType === \"union\") {\n const { objectName, types } = entry;\n history[objectName] = types;\n } else {\n const { objectName, fieldName } = entry;\n const fields = (history[objectName] = history[objectName] || []);\n if (!fields.includes(fieldName)) {\n fields.push(fieldName);\n }\n }\n });\n await writeHistory(fs, history);\n}\n\n/** Makes the project's pagination metadata type. */\nfunction createPageInfoFields(config: Config): GqlField[] {\n const common = { file: \"pageInfo.graphql\", objectType: \"output\" as const, objectName: \"PageInfo\" };\n const shared = [\n { ...common, fieldName: \"hasNextPage\", fieldType: \"Boolean!\" },\n { ...common, fieldName: \"hasPreviousPage\", fieldType: \"Boolean!\" },\n { ...common, fieldName: \"totalCount\", fieldType: \"Int!\" },\n ];\n\n // Joist assumes each project uses either cursor or limit pagination, so the public GraphQL type is\n // always named `PageInfo` but contains the fields for the configured pagination style.\n if ((config.paginationStyle ?? \"cursor\") === \"limit\") {\n return [\n ...shared,\n { ...common, fieldName: \"nextPage\", fieldType: \"Int\" },\n { ...common, fieldName: \"currentPage\", fieldType: \"Int\" },\n ];\n }\n\n return [\n ...shared,\n { ...common, fieldName: \"startCursor\", fieldType: \"String\" },\n { ...common, fieldName: \"endCursor\", fieldType: \"String\" },\n ];\n}\n\n/** Make all the fields for `type Author`, `type Book`, etc. */\nfunction createPolymorphicUnions(entities: EntityDbMetadata[]): GqlUnion[] {\n return entities.flatMap((e) => {\n const file = fileName(e);\n return e.polymorphics.map(({ fieldType, components }) => {\n return { file, objectType: \"union\", objectName: fieldType, types: components.map((c) => c.otherEntity.name) };\n });\n });\n}\n\n/** Make all the fields for `type Author`, `type Book`, etc. */\nfunction createEntityFields(dbMeta: DbMetadata): GqlField[] {\n const { entities } = dbMeta;\n return entities.flatMap((e) => {\n const file = fileName(e);\n const objectType = \"output\" as const;\n const objectName = e.entity.name;\n const common = { file, objectType, objectName };\n\n const id: GqlField = { ...common, fieldName: \"id\", fieldType: \"ID!\" };\n\n const primitives = e.primitives.flatMap(({ fieldName, fieldType: tsType, isArray, notNull }) => {\n const fieldType = primitiveFieldType(fieldName, tsType, isArray, notNull);\n if (!fieldType) return [];\n return [{ ...common, fieldName, fieldType }];\n });\n\n const enums = e.enums.map(({ fieldName, enumType, notNull, isArray }) => {\n const fieldType = isArray ? `[${enumType.symbol}!]!` : `${enumType.symbol}Detail${maybeRequired(notNull)}`;\n return { ...common, fieldName, fieldType };\n });\n const pgEnums = e.pgEnums.map(({ fieldName, enumType, notNull }) => {\n const fieldType = `${enumType.symbol}${maybeRequired(notNull)}`;\n return { ...common, fieldName, fieldType };\n });\n\n const m2os = e.manyToOnes.map(({ fieldName, otherEntity, notNull }) => {\n const other = dbMeta.entitiesByName[otherEntity.name];\n const maybeLike = other.subTypes.length > 0 && !other.abstract ? \"Like\" : \"\";\n const fieldType = `${otherEntity.name}${maybeLike}${maybeRequired(notNull)}`;\n return { ...common, fieldName, fieldType };\n });\n\n const o2ms = e.oneToManys.map(({ fieldName, otherEntity }) => {\n const fieldType = `[${otherEntity.name}!]!`;\n return { ...common, fieldName, fieldType };\n });\n\n const m2ms = e.manyToManys.map(({ fieldName, otherEntity }) => {\n const fieldType = `[${otherEntity.name}!]!`;\n return { ...common, fieldName, fieldType };\n });\n\n const o2os = e.oneToOnes.map(({ fieldName, otherEntity }) => {\n return { ...common, fieldName, fieldType: otherEntity.name };\n });\n\n const polys = e.polymorphics.map(({ fieldName, fieldType }) => {\n return { ...common, fieldName, fieldType };\n });\n\n // GraphQL wants base fields copy/pasted onto subtypes, so re-run ourselves against just the base type\n const inheritedFields = e.baseClassName\n ? createEntityFields(findBaseEntity(dbMeta, e.baseClassName))\n .map((f) => ({ ...f, ...common }))\n .filter((f) => f.fieldName !== \"id\")\n : [];\n\n return [id, ...inheritedFields, ...primitives, ...enums, ...pgEnums, ...m2os, ...o2ms, ...m2ms, ...o2os, ...polys];\n });\n}\n\n/** Makes the `Mutations.save${entity}` placeholder. */\nfunction createSaveMutation(entities: EntityDbMetadata[]): GqlField[] {\n return entities.map((e) => {\n const file = fileName(e);\n const inputType = `Save${e.entity.name}Input`;\n const outputType = `Save${e.entity.name}Result`;\n return {\n file,\n objectType: \"output\",\n objectName: \"Mutation\",\n fieldName: `save${e.entity.name}`,\n fieldType: `${outputType}!`,\n argsString: `input: ${inputType}!`,\n extends: true,\n };\n });\n}\n\n/** Makes the `Query.${entity}` and `Query.${entity}s` placeholders. */\nfunction createQueryFields(config: Config, entities: EntityDbMetadata[]): GqlField[] {\n return entities.flatMap((e) => {\n const file = fileName(e);\n const { name } = e.entity;\n const pluralName = pluralize(name);\n const camelName = camelCase(name);\n const pluralCamelName = pluralize(camelName);\n const collectionType =\n (config.paginationStyle ?? \"cursor\") === \"limit\" ? `${pluralName}Page!` : `${pluralName}Connection!`;\n const collectionArgs =\n (config.paginationStyle ?? \"cursor\") === \"limit\"\n ? `filter: ${name}Filter, limit: Int, offset: Int`\n : `filter: ${name}Filter, first: Int, after: String, last: Int, before: String`;\n return [\n {\n file,\n objectType: \"output\",\n objectName: \"Query\",\n fieldName: camelName,\n fieldType: `${name}!`,\n argsString: `id: ID!`,\n extends: true,\n },\n {\n file,\n objectType: \"output\",\n objectName: \"Query\",\n fieldName: pluralCamelName,\n fieldType: collectionType,\n argsString: collectionArgs,\n extends: true,\n },\n ...createPaginationTypes(config, file, e),\n ];\n });\n}\n\n/** Makes the `AuthorFilter`, `BookFilter`, etc. input types. */\nfunction createFilterFields(dbMeta: DbMetadata): GqlField[] {\n const { entities } = dbMeta;\n return entities.flatMap((e) => {\n const file = fileName(e);\n const objectType = \"input\" as const;\n const objectName = `${e.entity.name}Filter`;\n const common = { file, objectType, objectName };\n\n const id: GqlField = { ...common, fieldName: \"id\", fieldType: filterListType(\"ID\") };\n\n const primitives = e.primitives.flatMap(({ fieldName, fieldType: tsType, isArray }) => {\n const fieldType = primitiveFieldType(fieldName, tsType, isArray);\n if (!fieldType) return [];\n return [{ ...common, fieldName, fieldType: filterListType(fieldType) }];\n });\n\n const enums = e.enums.map(({ fieldName, enumType, isArray }) => {\n const fieldType = isArray ? `[${enumType.symbol}!]` : enumType.symbol;\n return { ...common, fieldName, fieldType: filterListType(fieldType) };\n });\n const pgEnums = e.pgEnums.map(({ fieldName, enumType }) => {\n return { ...common, fieldName, fieldType: filterListType(enumType.symbol) };\n });\n\n const m2os = e.manyToOnes.map(({ fieldName }) => {\n return { ...common, fieldName: `${fieldName}Id`, fieldType: filterListType(\"ID\") };\n });\n\n const polys = e.polymorphics.map(({ fieldName }) => {\n return { ...common, fieldName: `${fieldName}Id`, fieldType: filterListType(\"ID\") };\n });\n\n const inherited = e.baseClassName\n ? createFilterFields(findBaseEntity(dbMeta, e.baseClassName))\n .map((f) => ({ ...f, ...common }))\n .filter((f) => f.fieldName !== \"id\")\n : [];\n\n return [id, ...inherited, ...primitives, ...enums, ...pgEnums, ...m2os, ...polys];\n });\n}\n\n/** Makes the page/connection types for `Query.authors`. */\nfunction createPaginationTypes(config: Config, file: string, e: EntityDbMetadata): GqlField[] {\n const { name } = e.entity;\n const pluralName = pluralize(name);\n const objectType = \"output\" as const;\n if ((config.paginationStyle ?? \"cursor\") === \"limit\") {\n return [\n { file, objectType, objectName: `${pluralName}Page`, fieldName: \"entities\", fieldType: `[${name}!]!` },\n { file, objectType, objectName: `${pluralName}Page`, fieldName: \"pageInfo\", fieldType: \"PageInfo!\" },\n ];\n }\n return [\n { file, objectType, objectName: `${pluralName}Connection`, fieldName: \"edges\", fieldType: `[${pluralName}Edge!]!` },\n { file, objectType, objectName: `${pluralName}Connection`, fieldName: \"nodes\", fieldType: `[${name}!]!` },\n { file, objectType, objectName: `${pluralName}Connection`, fieldName: \"pageInfo\", fieldType: \"PageInfo!\" },\n { file, objectType, objectName: `${pluralName}Edge`, fieldName: \"node\", fieldType: `${name}!` },\n { file, objectType, objectName: `${pluralName}Edge`, fieldName: \"cursor\", fieldType: \"String!\" },\n ];\n}\n\n/** Make all the fields for `type SaveAuthorInput`, `type SaveBookBook`, etc. */\nfunction createSaveEntityInputFields(dbMeta: DbMetadata): GqlField[] {\n const { entities } = dbMeta;\n return entities.flatMap((e) => {\n const file = fileName(e);\n const objectType = \"input\" as const;\n const objectName = `Save${e.entity.name}Input`;\n const common = { file, objectType, objectName };\n\n const id: GqlField = { ...common, fieldName: \"id\", fieldType: \"ID\" };\n\n const primitives = e.primitives\n .filter((f) => f.derived === false)\n .flatMap(({ fieldName, fieldType: tsType, isArray }) => {\n const fieldType = primitiveFieldType(fieldName, tsType, isArray);\n if (!fieldType) return [];\n return [{ ...common, fieldName, fieldType }];\n });\n\n const enums = e.enums.map(({ fieldName, enumType, isArray }) => {\n return { ...common, fieldName, fieldType: isArray ? `[${enumType.symbol}!]` : enumType.symbol };\n });\n const pgEnums = e.pgEnums.map(({ fieldName, enumType }) => {\n return { ...common, fieldName, fieldType: enumType.symbol };\n });\n\n const m2os = e.manyToOnes.map(({ fieldName }) => {\n return { ...common, fieldName: `${fieldName}Id`, fieldType: \"ID\" };\n });\n\n const polys = e.polymorphics.map(({ fieldName }) => {\n return { ...common, fieldName: `${fieldName}Id`, fieldType: \"ID\" };\n });\n\n const inherited = e.baseClassName\n ? createSaveEntityInputFields(findBaseEntity(dbMeta, e.baseClassName))\n .map((f) => ({ ...f, ...common }))\n .filter((f) => f.fieldName !== \"id\")\n : [];\n\n return [id, ...inherited, ...primitives, ...enums, ...pgEnums, ...m2os, ...polys];\n });\n}\n\n/** Makes the fields for `type SaveAuthorResult`, `type SaveBookResult`, etc. */\nfunction createSaveEntityResultFields(entities: EntityDbMetadata[]): GqlField[] {\n return entities.flatMap((e) => {\n const file = fileName(e);\n const {\n entity: { name },\n } = e;\n const objectType = \"output\" as const;\n const objectName = `Save${name}Result`;\n const fieldName = camelCase(name);\n const entity: GqlField = { file, objectType, objectName, fieldName, fieldType: `${name}!` };\n return [entity];\n });\n}\n\nfunction maybeRequired(notNull: boolean): string {\n return notNull ? \"!\" : \"\";\n}\n\n/** Returns the GraphQL type for primitive fields, including primitive arrays. */\nfunction primitiveFieldType(\n fieldName: string,\n tsType: Parameters<typeof mapTypescriptTypeToGraphQLType>[1],\n isArray: boolean,\n notNull = false,\n): string | undefined {\n const gqlType = mapTypescriptTypeToGraphQLType(fieldName, tsType);\n if (!gqlType) return undefined;\n const fieldType = isArray ? `[${gqlType}!]` : gqlType;\n return `${fieldType}${maybeRequired(notNull)}`;\n}\n\n/** Wraps filter fields in lists so GraphQL callers can pass one value or OR several values. */\nfunction filterListType(fieldType: string): string {\n return `[${fieldType}!]`;\n}\n\n/** I.e. `Book` --> `books.graphql`. */\nfunction fileName(e: EntityDbMetadata): string {\n return `${camelCase(e.entity.name)}.graphql`;\n}\n\nfunction findBaseEntity(dbMeta: DbMetadata, baseClassName: string): DbMetadata {\n return {\n ...dbMeta,\n entities: dbMeta.entities.filter((e) => e.entity.name === baseClassName),\n };\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
+ import { Fs } from "./utils.cjs";
1
2
  import { Config, DbMetadata } from "joist-codegen";
2
- import { Fs } from "./utils";
3
+ //#region src/generateGraphqlSchemaFiles.d.ts
3
4
  /**
4
5
  * Generates `*.graphql` files based on the database schema.
5
6
  *
@@ -8,4 +9,7 @@ import { Fs } from "./utils";
8
9
  * and will only do them once, which allows programmers to manually add/edit/remove fields
9
10
  * without this stomping over their changes.
10
11
  */
11
- export declare function generateGraphqlSchemaFiles(config: Config, fs: Fs, dbMeta: DbMetadata): Promise<void>;
12
+ declare function generateGraphqlSchemaFiles(config: Config, fs: Fs, dbMeta: DbMetadata): Promise<void>;
13
+ //#endregion
14
+ export { generateGraphqlSchemaFiles };
15
+ //# sourceMappingURL=generateGraphqlSchemaFiles.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateGraphqlSchemaFiles.d.cts","names":[],"sources":["../src/generateGraphqlSchemaFiles.ts"],"mappings":";;;;;;;;;;;iBAiBsB,2BAA2B,QAAQ,QAAQ,IAAI,IAAI,QAAQ,aAAa"}
@@ -0,0 +1,15 @@
1
+ import { Fs } from "./utils.mjs";
2
+ import { Config, DbMetadata } from "joist-codegen";
3
+ //#region src/generateGraphqlSchemaFiles.d.ts
4
+ /**
5
+ * Generates `*.graphql` files based on the database schema.
6
+ *
7
+ * This follows an "evergreen" approach where we upsert changes into files that are also
8
+ * hand-modified by the programmer. We remember what insertions we've made in a history file,
9
+ * and will only do them once, which allows programmers to manually add/edit/remove fields
10
+ * without this stomping over their changes.
11
+ */
12
+ declare function generateGraphqlSchemaFiles(config: Config, fs: Fs, dbMeta: DbMetadata): Promise<void>;
13
+ //#endregion
14
+ export { generateGraphqlSchemaFiles };
15
+ //# sourceMappingURL=generateGraphqlSchemaFiles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateGraphqlSchemaFiles.d.mts","names":[],"sources":["../src/generateGraphqlSchemaFiles.ts"],"mappings":";;;;;;;;;;;iBAiBsB,2BAA2B,QAAQ,QAAQ,IAAI,IAAI,QAAQ,aAAa"}