joist-graphql-codegen 2.3.0-next.42 → 2.3.0-next.44

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