@comet/admin-generator 8.17.1 → 9.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/bin/admin-generator.mjs +3 -0
  2. package/dist/adminGenerator.d.mts +1 -0
  3. package/dist/adminGenerator.mjs +4441 -0
  4. package/dist/index.d.mts +344 -0
  5. package/dist/index.mjs +4440 -0
  6. package/package.json +31 -21
  7. package/bin/admin-generator.js +0 -8
  8. package/lib/adminGenerator.d.ts +0 -1
  9. package/lib/adminGenerator.js +0 -8
  10. package/lib/commands/generate/config/parseConfig.d.ts +0 -1
  11. package/lib/commands/generate/config/parseConfig.js +0 -72
  12. package/lib/commands/generate/config/transformConfig.d.ts +0 -7
  13. package/lib/commands/generate/config/transformConfig.js +0 -264
  14. package/lib/commands/generate/generate-command.d.ts +0 -340
  15. package/lib/commands/generate/generate-command.js +0 -112
  16. package/lib/commands/generate/generateForm/asyncSelect/generateAsyncSelect.d.ts +0 -26
  17. package/lib/commands/generate/generateForm/asyncSelect/generateAsyncSelect.js +0 -364
  18. package/lib/commands/generate/generateForm/extractErrorEnums.d.ts +0 -16
  19. package/lib/commands/generate/generateForm/extractErrorEnums.js +0 -100
  20. package/lib/commands/generate/generateForm/flatFormFieldsFromFormConfig.d.ts +0 -2
  21. package/lib/commands/generate/generateForm/flatFormFieldsFromFormConfig.js +0 -22
  22. package/lib/commands/generate/generateForm/formField/findIntrospectionFieldType.d.ts +0 -6
  23. package/lib/commands/generate/generateForm/formField/findIntrospectionFieldType.js +0 -22
  24. package/lib/commands/generate/generateForm/formField/options.d.ts +0 -24
  25. package/lib/commands/generate/generateForm/formField/options.js +0 -85
  26. package/lib/commands/generate/generateForm/generateComponentFormField.d.ts +0 -5
  27. package/lib/commands/generate/generateForm/generateComponentFormField.js +0 -22
  28. package/lib/commands/generate/generateForm/generateErrorHandling.d.ts +0 -8
  29. package/lib/commands/generate/generateForm/generateErrorHandling.js +0 -24
  30. package/lib/commands/generate/generateForm/generateErrorMessages.d.ts +0 -11
  31. package/lib/commands/generate/generateForm/generateErrorMessages.js +0 -28
  32. package/lib/commands/generate/generateForm/generateFields.d.ts +0 -42
  33. package/lib/commands/generate/generateForm/generateFields.js +0 -87
  34. package/lib/commands/generate/generateForm/generateForm.d.ts +0 -14
  35. package/lib/commands/generate/generateForm/generateForm.js +0 -565
  36. package/lib/commands/generate/generateForm/generateFormField.d.ts +0 -12
  37. package/lib/commands/generate/generateForm/generateFormField.js +0 -368
  38. package/lib/commands/generate/generateForm/generateFormLayout.d.ts +0 -12
  39. package/lib/commands/generate/generateForm/generateFormLayout.js +0 -154
  40. package/lib/commands/generate/generateForm/generateFormValues.d.ts +0 -40
  41. package/lib/commands/generate/generateForm/generateFormValues.js +0 -219
  42. package/lib/commands/generate/generateForm/generateFragmentByFormFragmentFields.d.ts +0 -11
  43. package/lib/commands/generate/generateForm/generateFragmentByFormFragmentFields.js +0 -29
  44. package/lib/commands/generate/generateForm/getForwardedGqlArgs.d.ts +0 -18
  45. package/lib/commands/generate/generateForm/getForwardedGqlArgs.js +0 -79
  46. package/lib/commands/generate/generateGrid/detectMuiXVersion.d.ts +0 -5
  47. package/lib/commands/generate/generateGrid/detectMuiXVersion.js +0 -32
  48. package/lib/commands/generate/generateGrid/findInputObjectType.d.ts +0 -2
  49. package/lib/commands/generate/generateGrid/findInputObjectType.js +0 -15
  50. package/lib/commands/generate/generateGrid/generateGqlFieldList.d.ts +0 -6
  51. package/lib/commands/generate/generateGrid/generateGqlFieldList.js +0 -56
  52. package/lib/commands/generate/generateGrid/generateGrid.d.ts +0 -16
  53. package/lib/commands/generate/generateGrid/generateGrid.js +0 -1017
  54. package/lib/commands/generate/generateGrid/generateGridToolbar.d.ts +0 -15
  55. package/lib/commands/generate/generateGrid/generateGridToolbar.js +0 -90
  56. package/lib/commands/generate/generateGrid/getForwardedGqlArgs.d.ts +0 -13
  57. package/lib/commands/generate/generateGrid/getForwardedGqlArgs.js +0 -59
  58. package/lib/commands/generate/generateGrid/getPropsForFilterProp.d.ts +0 -14
  59. package/lib/commands/generate/generateGrid/getPropsForFilterProp.js +0 -13
  60. package/lib/commands/generate/generateGrid/usableFields.d.ts +0 -14
  61. package/lib/commands/generate/generateGrid/usableFields.js +0 -3
  62. package/lib/commands/generate/utils/camelCaseToHumanReadable.d.ts +0 -1
  63. package/lib/commands/generate/utils/camelCaseToHumanReadable.js +0 -7
  64. package/lib/commands/generate/utils/columnVisibility.d.ts +0 -6
  65. package/lib/commands/generate/utils/columnVisibility.js +0 -2
  66. package/lib/commands/generate/utils/convertConfigImport.d.ts +0 -6
  67. package/lib/commands/generate/utils/convertConfigImport.js +0 -14
  68. package/lib/commands/generate/utils/findMutationType.d.ts +0 -3
  69. package/lib/commands/generate/utils/findMutationType.js +0 -18
  70. package/lib/commands/generate/utils/findQueryType.d.ts +0 -2
  71. package/lib/commands/generate/utils/findQueryType.js +0 -18
  72. package/lib/commands/generate/utils/findRootBlocks.d.ts +0 -8
  73. package/lib/commands/generate/utils/findRootBlocks.js +0 -66
  74. package/lib/commands/generate/utils/generateGqlOperation.d.ts +0 -12
  75. package/lib/commands/generate/utils/generateGqlOperation.js +0 -87
  76. package/lib/commands/generate/utils/generateImportsCode.d.ts +0 -6
  77. package/lib/commands/generate/utils/generateImportsCode.js +0 -31
  78. package/lib/commands/generate/utils/intl.d.ts +0 -20
  79. package/lib/commands/generate/utils/intl.js +0 -44
  80. package/lib/commands/generate/utils/isFieldOptional.d.ts +0 -7
  81. package/lib/commands/generate/utils/isFieldOptional.js +0 -21
  82. package/lib/commands/generate/utils/runtimeTypeGuards.d.ts +0 -20
  83. package/lib/commands/generate/utils/runtimeTypeGuards.js +0 -22
  84. package/lib/commands/generate/utils/writeGenerated.d.ts +0 -1
  85. package/lib/commands/generate/utils/writeGenerated.js +0 -123
  86. package/lib/index.d.ts +0 -2
  87. package/lib/index.js +0 -6
@@ -1,565 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateForm = generateForm;
4
- const generate_command_1 = require("../generate-command");
5
- const convertConfigImport_1 = require("../utils/convertConfigImport");
6
- const findMutationType_1 = require("../utils/findMutationType");
7
- const generateGqlOperation_1 = require("../utils/generateGqlOperation");
8
- const generateImportsCode_1 = require("../utils/generateImportsCode");
9
- const runtimeTypeGuards_1 = require("../utils/runtimeTypeGuards");
10
- const extractErrorEnums_1 = require("./extractErrorEnums");
11
- const flatFormFieldsFromFormConfig_1 = require("./flatFormFieldsFromFormConfig");
12
- const generateErrorHandling_1 = require("./generateErrorHandling");
13
- const generateErrorMessages_1 = require("./generateErrorMessages");
14
- const generateFields_1 = require("./generateFields");
15
- const generateFormValues_1 = require("./generateFormValues");
16
- const generateFragmentByFormFragmentFields_1 = require("./generateFragmentByFormFragmentFields");
17
- const getForwardedGqlArgs_1 = require("./getForwardedGqlArgs");
18
- /**
19
- * Detects if a mutation has a wrapped payload response type (e.g., CreateProductPayload with product and errors fields)
20
- * vs returning the entity directly.
21
- */
22
- function hasPayloadResponseType(mutationField, gqlType) {
23
- let returnType = mutationField.type;
24
- if (returnType.kind === "NON_NULL") {
25
- returnType = returnType.ofType;
26
- }
27
- if (returnType.kind === "OBJECT" && returnType.name === gqlType) {
28
- return false;
29
- }
30
- else {
31
- return true;
32
- }
33
- }
34
- function generateFormPropsCode(props) {
35
- if (!props.length)
36
- return { formPropsTypeCode: "", formPropsParamsCode: "" };
37
- const uniqueProps = props.reduce((acc, item) => {
38
- const propWithSameName = acc.find((prop) => prop.name == item.name);
39
- if (!propWithSameName)
40
- return [item, ...acc];
41
- if (propWithSameName.type != item.type || propWithSameName.optional != item.optional) {
42
- // this is currently not supported
43
- return [item, ...acc];
44
- }
45
- return acc;
46
- }, []);
47
- return {
48
- formPropsTypeCode: `interface FormProps {
49
- ${uniqueProps.map((prop) => `${prop.name}${prop.optional ? `?` : ``}: ${prop.type};`).join("\n")}
50
- }`,
51
- formPropsParamsCode: `{${uniqueProps.map((prop) => prop.name + (prop.localAliasName ? `: ${prop.localAliasName}` : "")).join(", ")}}: FormProps`,
52
- };
53
- }
54
- function generateForm({ exportName, baseOutputFilename, targetDirectory, gqlIntrospection, },
55
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
- config) {
57
- var _a, _b, _c, _d, _e, _f, _g;
58
- assertValidConfig(config);
59
- const gqlType = config.gqlType;
60
- const instanceGqlType = gqlType[0].toLowerCase() + gqlType.substring(1);
61
- const formFragmentName = (_a = config.fragmentName) !== null && _a !== void 0 ? _a : `${gqlType}Form`;
62
- const gqlDocuments = {};
63
- const imports = [
64
- { name: "FormattedMessage", importPath: "react-intl" },
65
- { name: "useApolloClient", importPath: "@apollo/client" },
66
- { name: "useQuery", importPath: "@apollo/client" },
67
- { name: "gql", importPath: "@apollo/client" },
68
- { name: "CheckboxField", importPath: "@comet/admin" },
69
- { name: "Field", importPath: "@comet/admin" },
70
- { name: "filterByFragment", importPath: "@comet/admin" },
71
- { name: "FinalForm", importPath: "@comet/admin" },
72
- { name: "FinalFormInput", importPath: "@comet/admin" },
73
- { name: "FinalFormRangeInput", importPath: "@comet/admin" },
74
- { name: "FinalFormSelect", importPath: "@comet/admin" },
75
- { name: "FinalFormSubmitEvent", importPath: "@comet/admin" },
76
- { name: "Loading", importPath: "@comet/admin" },
77
- { name: "NumberField", importPath: "@comet/admin" },
78
- { name: "RadioGroupField", importPath: "@comet/admin" },
79
- { name: "TextAreaField", importPath: "@comet/admin" },
80
- { name: "TextField", importPath: "@comet/admin" },
81
- { name: "useFormApiRef", importPath: "@comet/admin" },
82
- { name: "useStackSwitchApi", importPath: "@comet/admin" },
83
- { name: "ArrowLeft", importPath: "@comet/admin-icons" },
84
- { name: "Lock", importPath: "@comet/admin-icons" },
85
- { name: "DateTimeField", importPath: "@comet/admin-date-time" },
86
- { name: "FinalFormDatePicker", importPath: "@comet/admin-date-time" },
87
- { name: "BlockState", importPath: "@comet/cms-admin" },
88
- { name: "createFinalFormBlock", importPath: "@comet/cms-admin" },
89
- { name: "queryUpdatedAt", importPath: "@comet/cms-admin" },
90
- { name: "resolveHasSaveConflict", importPath: "@comet/cms-admin" },
91
- { name: "useFormSaveConflict", importPath: "@comet/cms-admin" },
92
- { name: "FileUploadField", importPath: "@comet/cms-admin" },
93
- { name: "IconButton", importPath: "@mui/material" },
94
- { name: "MenuItem", importPath: "@mui/material" },
95
- { name: "InputAdornment", importPath: "@mui/material" },
96
- { name: "FormApi", importPath: "final-form" },
97
- { name: "useMemo", importPath: "react" },
98
- ];
99
- const formProps = [];
100
- const mode = (_b = config.mode) !== null && _b !== void 0 ? _b : "all";
101
- const editMode = mode === "edit" || mode == "all";
102
- const addMode = mode === "add" || mode == "all";
103
- const createMutationType = addMode && (0, findMutationType_1.findMutationTypeOrThrow)((_c = config.createMutation) !== null && _c !== void 0 ? _c : `create${gqlType}`, gqlIntrospection);
104
- const updateMutationType = editMode && (0, findMutationType_1.findMutationTypeOrThrow)(`update${gqlType}`, gqlIntrospection);
105
- const createMutationHasPayloadResponse = createMutationType && hasPayloadResponseType(createMutationType, gqlType);
106
- const updateMutationHasPayloadResponse = updateMutationType && hasPayloadResponseType(updateMutationType, gqlType);
107
- // Extract error enum types from mutations
108
- const errorEnums = (0, extractErrorEnums_1.extractErrorEnumsFromMutations)({
109
- createMutationType: createMutationHasPayloadResponse ? createMutationType : null,
110
- updateMutationType: updateMutationHasPayloadResponse ? updateMutationType : null,
111
- gqlIntrospection,
112
- });
113
- // Add imports for error handling if error enums exist
114
- if (errorEnums.createErrorEnum || errorEnums.updateErrorEnum) {
115
- imports.push({ name: "ReactNode", importPath: "react" });
116
- imports.push({ name: "FORM_ERROR", importPath: "final-form" });
117
- imports.push({ name: "FormattedMessage", importPath: "react-intl" });
118
- }
119
- const formFields = (0, flatFormFieldsFromFormConfig_1.flatFormFieldsFromFormConfig)(config);
120
- let useScopeFromContext = false;
121
- const gqlArgs = [];
122
- if (createMutationType) {
123
- const forwardedArgs = (0, getForwardedGqlArgs_1.getForwardedGqlArgs)({
124
- fields: formFields,
125
- gqlOperation: createMutationType,
126
- gqlIntrospection,
127
- });
128
- for (const forwardedArg of forwardedArgs) {
129
- imports.push(...forwardedArg.imports);
130
- if (forwardedArg.gqlArg.name === "scope" && !forwardedArg.gqlArg.isInputArgSubfield && !config.scopeAsProp) {
131
- useScopeFromContext = true;
132
- gqlArgs.push(forwardedArg.gqlArg);
133
- }
134
- else {
135
- formProps.push(forwardedArg.prop);
136
- gqlArgs.push(forwardedArg.gqlArg);
137
- }
138
- }
139
- }
140
- if (useScopeFromContext) {
141
- imports.push({ name: "useContentScope", importPath: "@comet/cms-admin" });
142
- }
143
- if (editMode) {
144
- if (mode === "all") {
145
- formProps.push({ name: "id", optional: true, type: "string" });
146
- }
147
- else if (mode === "edit") {
148
- formProps.push({ name: "id", optional: false, type: "string" });
149
- }
150
- }
151
- const rootBlockFields = formFields
152
- .filter((field) => field.type == "block")
153
- .map((field) => {
154
- // map is for ts to infer block type correctly
155
- if (field.type !== "block")
156
- throw new Error("Field is not a block field");
157
- return field;
158
- });
159
- rootBlockFields.forEach((field) => {
160
- if ((0, runtimeTypeGuards_1.isGeneratorConfigImport)(field.block)) {
161
- imports.push((0, convertConfigImport_1.convertConfigImport)(field.block));
162
- }
163
- });
164
- const readOnlyFields = formFields.filter((field) => field.readOnly);
165
- const fileFields = formFields.filter((field) => field.type == "fileUpload");
166
- if (fileFields.length > 0) {
167
- imports.push({ name: "GQLFinalFormFileUploadFragment", importPath: "@comet/cms-admin" });
168
- imports.push({ name: "GQLFinalFormFileUploadDownloadableFragment", importPath: "@comet/cms-admin" });
169
- }
170
- let hooksCode = "";
171
- const formFragmentFields = [];
172
- const formValuesConfig = [];
173
- const generatedFields = (0, generateFields_1.generateFields)({
174
- gqlIntrospection,
175
- baseOutputFilename,
176
- fields: config.fields,
177
- formFragmentName,
178
- formConfig: config,
179
- gqlType: config.gqlType,
180
- });
181
- const fieldsCode = generatedFields.code;
182
- for (const name in generatedFields.gqlDocuments) {
183
- gqlDocuments[name] = {
184
- document: generatedFields.gqlDocuments[name].document,
185
- export: true,
186
- };
187
- }
188
- imports.push(...generatedFields.imports);
189
- formProps.push(...generatedFields.formProps);
190
- hooksCode += generatedFields.hooksCode;
191
- formFragmentFields.push(...generatedFields.formFragmentFields);
192
- formValuesConfig.push(...generatedFields.formValuesConfig);
193
- formProps.push({
194
- name: "onCreate",
195
- optional: true,
196
- type: `(id: string) => void`,
197
- });
198
- if (config.initialValuesAsProp) {
199
- formProps.push({
200
- name: "initialValues",
201
- localAliasName: "passedInitialValues",
202
- optional: true,
203
- type: `Partial<FormValues>`,
204
- });
205
- }
206
- const { formPropsTypeCode, formPropsParamsCode } = generateFormPropsCode(formProps);
207
- gqlDocuments[`${instanceGqlType}FormFragment`] = {
208
- document: (0, generateFragmentByFormFragmentFields_1.generateFragmentByFormFragmentFields)({ formFragmentName, gqlType, formFragmentFields }),
209
- export: editMode,
210
- };
211
- if (editMode) {
212
- gqlDocuments[`${instanceGqlType}Query`] = {
213
- document: (0, generateGqlOperation_1.generateGqlOperation)({
214
- type: "query",
215
- operationName: gqlType,
216
- rootOperation: instanceGqlType,
217
- fields: ["id", "updatedAt", `...${formFragmentName}`],
218
- variables: [
219
- {
220
- name: "id",
221
- type: "ID!",
222
- },
223
- ],
224
- fragmentVariables: [`\${${`${instanceGqlType}FormFragment`}}`],
225
- }),
226
- export: true,
227
- };
228
- }
229
- if (addMode && createMutationType) {
230
- gqlDocuments[`create${gqlType}Mutation`] = {
231
- document: (0, generateGqlOperation_1.generateGqlOperation)({
232
- type: "mutation",
233
- operationName: `Create${gqlType}`,
234
- rootOperation: createMutationType.name,
235
- fields: createMutationHasPayloadResponse
236
- ? [
237
- `${instanceGqlType}.id`,
238
- `${instanceGqlType}.updatedAt`,
239
- `${instanceGqlType}...${formFragmentName}`,
240
- "errors.code",
241
- "errors.field",
242
- ]
243
- : ["id", "updatedAt", `...${formFragmentName}`],
244
- fragmentVariables: [`\${${`${instanceGqlType}FormFragment`}}`],
245
- variables: [
246
- ...gqlArgs
247
- .filter((gqlArg) => !gqlArg.isInputArgSubfield)
248
- .map((gqlArg) => ({
249
- name: gqlArg.name,
250
- type: `${gqlArg.type}!`,
251
- })),
252
- {
253
- name: "input",
254
- type: `${gqlType}Input!`,
255
- },
256
- ],
257
- }),
258
- export: true,
259
- };
260
- }
261
- if (editMode) {
262
- gqlDocuments[`update${gqlType}Mutation`] = {
263
- document: (0, generateGqlOperation_1.generateGqlOperation)({
264
- type: "mutation",
265
- operationName: `Update${gqlType}`,
266
- rootOperation: `update${gqlType}`,
267
- fields: updateMutationHasPayloadResponse
268
- ? [
269
- `${instanceGqlType}.id`,
270
- `${instanceGqlType}.updatedAt`,
271
- `${instanceGqlType}...${formFragmentName}`,
272
- "errors.code",
273
- "errors.field",
274
- ]
275
- : ["id", "updatedAt", `...${formFragmentName}`],
276
- fragmentVariables: [`\${${`${instanceGqlType}FormFragment`}}`],
277
- variables: [
278
- {
279
- name: "id",
280
- type: "ID!",
281
- },
282
- {
283
- name: "input",
284
- type: `${gqlType}UpdateInput!`,
285
- },
286
- ],
287
- }),
288
- export: true,
289
- };
290
- }
291
- for (const name in gqlDocuments) {
292
- const gqlDocument = gqlDocuments[name];
293
- imports.push({
294
- name: name,
295
- importPath: `./${baseOutputFilename}.gql`,
296
- });
297
- const match = gqlDocument.document.match(/^\s*(query|mutation|fragment)\s+(\w+)/);
298
- if (!match)
299
- throw new Error(`Could not find query or mutation name in ${gqlDocument}`);
300
- const type = match[1];
301
- const documentName = match[2];
302
- imports.push({
303
- name: `GQL${documentName}${type[0].toUpperCase() + type.substring(1)}`,
304
- importPath: `./${baseOutputFilename}.gql.generated`,
305
- });
306
- if (type !== "fragment") {
307
- imports.push({
308
- name: `GQL${documentName}${type[0].toUpperCase() + type.substring(1)}Variables`,
309
- importPath: `./${baseOutputFilename}.gql.generated`,
310
- });
311
- }
312
- }
313
- const finalFormSubscription = Object.keys((_e = (_d = generatedFields.finalFormConfig) === null || _d === void 0 ? void 0 : _d.subscription) !== null && _e !== void 0 ? _e : {});
314
- const finalFormRenderProps = Object.keys((_g = (_f = generatedFields.finalFormConfig) === null || _f === void 0 ? void 0 : _f.renderProps) !== null && _g !== void 0 ? _g : {});
315
- let filterByFragmentType = `GQL${formFragmentName}Fragment`;
316
- let customFilterByFragment = "";
317
- if (fileFields.length > 0) {
318
- const keysToOverride = fileFields.map((field) => field.name);
319
- customFilterByFragment = `type ${formFragmentName}Fragment = Omit<${filterByFragmentType}, ${keysToOverride
320
- .map((key) => `"${String(key)}"`)
321
- .join(" | ")}> & {
322
- ${fileFields
323
- .map((field) => {
324
- if (field.type !== "fileUpload") {
325
- throw new Error("Field is not a file upload field");
326
- }
327
- if (("multiple" in field && field.multiple) ||
328
- ("maxFiles" in field && typeof field.maxFiles === "number" && field.maxFiles > 1)) {
329
- return `${String(field.name)}: ${field.download ? "GQLFinalFormFileUploadDownloadableFragment" : "GQLFinalFormFileUploadFragment"}[];`;
330
- }
331
- return `${String(field.name)}: ${field.download ? "GQLFinalFormFileUploadDownloadableFragment" : "GQLFinalFormFileUploadFragment"} | null;`;
332
- })
333
- .join("\n")}
334
- }`;
335
- filterByFragmentType = `${formFragmentName}Fragment`;
336
- }
337
- // Add error enum type imports if they exist
338
- if (errorEnums.createErrorEnum) {
339
- const typeName = `GQL${errorEnums.createErrorEnum}`;
340
- imports.push({
341
- name: typeName,
342
- importPath: `@src/graphql.generated`,
343
- });
344
- }
345
- if (errorEnums.useDifferentEnums && errorEnums.updateErrorEnum) {
346
- const typeName = `GQL${errorEnums.updateErrorEnum}`;
347
- imports.push({
348
- name: typeName,
349
- importPath: `@src/graphql.generated`,
350
- });
351
- }
352
- // Generate error messages code
353
- let errorMessagesCode = "";
354
- if (errorEnums.useDifferentEnums) {
355
- // Generate separate create and update error messages
356
- if (errorEnums.createErrorEnum) {
357
- errorMessagesCode += (0, generateErrorMessages_1.generateErrorMessagesCode)({
358
- enumName: errorEnums.createErrorEnum,
359
- gqlType: gqlType,
360
- variableName: "createErrorMessages",
361
- gqlIntrospection,
362
- });
363
- errorMessagesCode += "\n\n";
364
- }
365
- if (errorEnums.updateErrorEnum) {
366
- errorMessagesCode += (0, generateErrorMessages_1.generateErrorMessagesCode)({
367
- enumName: errorEnums.updateErrorEnum,
368
- gqlType: gqlType,
369
- variableName: "updateErrorMessages",
370
- gqlIntrospection,
371
- });
372
- }
373
- }
374
- else if (errorEnums.createErrorEnum || errorEnums.updateErrorEnum) {
375
- // Generate single shared error messages object
376
- const enumName = (errorEnums.createErrorEnum || errorEnums.updateErrorEnum);
377
- errorMessagesCode = (0, generateErrorMessages_1.generateErrorMessagesCode)({
378
- enumName,
379
- gqlType: gqlType,
380
- variableName: "submissionErrorMessages",
381
- gqlIntrospection,
382
- });
383
- }
384
- const code = `
385
- ${(0, generateImportsCode_1.generateImportsCode)(imports)}
386
- import isEqual from "lodash.isequal";
387
-
388
- ${rootBlockFields.length > 0
389
- ? `const rootBlocks = {
390
- ${rootBlockFields.map((field) => `${String(field.name)}: ${field.block.name}`)}
391
- };`
392
- : ""}
393
-
394
- ${customFilterByFragment}
395
-
396
- ${(0, generateFormValues_1.generateFormValuesType)({ formValuesConfig, filterByFragmentType, gqlIntrospection, gqlType })}
397
-
398
- ${formPropsTypeCode}
399
-
400
- ${errorMessagesCode}
401
-
402
- export function ${exportName}(${formPropsParamsCode}) {
403
- const client = useApolloClient();
404
- ${mode == "all" ? `const mode = id ? "edit" : "add";` : ""}
405
- const formApiRef = useFormApiRef<FormValues>();
406
- ${addMode ? `const stackSwitchApi = useStackSwitchApi();` : ""}
407
- ${useScopeFromContext ? `const { scope } = useContentScope();` : ""}
408
-
409
- ${editMode
410
- ? `
411
- const { data, error, loading, refetch } = useQuery<GQL${gqlType}Query, GQL${gqlType}QueryVariables>(
412
- ${instanceGqlType}Query,
413
- ${mode == "edit" ? `{ variables: { id } }` : `id ? { variables: { id } } : { skip: true }`},
414
- );
415
- `
416
- : ""}
417
-
418
- ${(0, generateFormValues_1.generateInitialValues)({ mode, formValuesConfig, filterByFragmentType, gqlIntrospection, gqlType, initialValuesAsProp: !!config.initialValuesAsProp })}
419
-
420
-
421
- ${editMode
422
- ? `
423
- const saveConflict = useFormSaveConflict({
424
- checkConflict: async () => {
425
- const updatedAt = await queryUpdatedAt(client, "${instanceGqlType}", id);
426
- return resolveHasSaveConflict(data?.${instanceGqlType}.updatedAt, updatedAt);
427
- },
428
- formApiRef,
429
- loadLatestVersion: async () => {
430
- await refetch();
431
- },
432
- });
433
- `
434
- : ""}
435
-
436
- const handleSubmit = async (${(0, generateFormValues_1.generateDestructFormValueForInput)({
437
- formValuesConfig,
438
- gqlIntrospection,
439
- gqlType,
440
- })}: FormValues, form: FormApi<FormValues>${addMode ? `, event: FinalFormSubmitEvent` : ""}) => {
441
- ${editMode ? `if (await saveConflict.checkForConflicts()) throw new Error("Conflicts detected");` : ""}
442
- ${(0, generateFormValues_1.generateFormValuesToGqlInput)({ formValuesConfig, gqlIntrospection, gqlType })}
443
-
444
- ${mode == "all" ? `if (mode === "edit") {` : ""}
445
- ${editMode
446
- ? `
447
- ${readOnlyFields.some((field) => field.name === "id") ? "" : "if (!id) throw new Error();"}
448
- const { ${readOnlyFields.map((field) => `${String(field.name)},`).join("")} ...updateInput } = output;
449
- ${updateMutationHasPayloadResponse ? `const { data: mutationResponse } = ` : ""}await client.mutate<GQLUpdate${gqlType}Mutation, GQLUpdate${gqlType}MutationVariables>({
450
- mutation: update${gqlType}Mutation,
451
- variables: { id, input: updateInput },
452
- });
453
- ${updateMutationHasPayloadResponse && updateMutationType && errorEnums.updateErrorEnum
454
- ? `
455
- ${(0, generateErrorHandling_1.generateErrorHandlingCode)({
456
- mutationResponsePath: `mutationResponse?.${updateMutationType.name}`,
457
- errorMessagesVariable: errorEnums.useDifferentEnums ? "updateErrorMessages" : "submissionErrorMessages",
458
- })}
459
- `
460
- : ""}
461
- `
462
- : ""}
463
- ${mode == "all" ? `} else {` : ""}
464
- ${addMode && createMutationType
465
- ? `
466
- const { data: mutationResponse } = await client.mutate<GQLCreate${gqlType}Mutation, GQLCreate${gqlType}MutationVariables>({
467
- mutation: create${gqlType}Mutation,
468
- variables: {
469
- input: ${gqlArgs.filter((prop) => prop.isInputArgSubfield).length
470
- ? `{ ...output, ${gqlArgs
471
- .filter((prop) => prop.isInputArgSubfield)
472
- .map((prop) => prop.name)
473
- .join(",")} }`
474
- : "output"}${gqlArgs.filter((prop) => !prop.isInputArgSubfield).length
475
- ? `, ${gqlArgs
476
- .filter((prop) => !prop.isInputArgSubfield)
477
- .map((arg) => arg.name)
478
- .join(",")}`
479
- : ""} },
480
- });
481
- ${createMutationHasPayloadResponse && errorEnums.createErrorEnum
482
- ? `
483
- ${(0, generateErrorHandling_1.generateErrorHandlingCode)({
484
- mutationResponsePath: `mutationResponse?.${createMutationType.name}`,
485
- errorMessagesVariable: errorEnums.useDifferentEnums ? "createErrorMessages" : "submissionErrorMessages",
486
- })}
487
- `
488
- : ""}
489
-
490
- const id = mutationResponse?.${createMutationType.name}${createMutationHasPayloadResponse ? `.${instanceGqlType}?` : ""}.id;
491
- if (id) {
492
- setTimeout(() => {
493
- onCreate?.(id);
494
- ${config.navigateOnCreate === true || config.navigateOnCreate === undefined
495
- ? `if (!event.navigatingBack) { stackSwitchApi.activatePage(\`edit\`, id);`
496
- : ``}
497
- });
498
- }
499
- `
500
- : ""}
501
- ${mode == "all" ? `}` : ""}
502
- };
503
-
504
- ${hooksCode}
505
-
506
- ${editMode
507
- ? ` if (error) throw error;
508
-
509
- if (loading) {
510
- return <Loading behavior="fillPageHeight" />;
511
- }`
512
- : ``}
513
-
514
- return (
515
- <FinalForm<FormValues>
516
- apiRef={formApiRef}
517
- onSubmit={handleSubmit}
518
- mode=${mode == "all" ? `{mode}` : editMode ? `"edit"` : `"add"`}
519
- initialValues={initialValues}
520
- initialValuesEqual={isEqual} //required to compare block data correctly
521
- subscription={{ ${finalFormSubscription.length ? finalFormSubscription.map((field) => `${field}: true`).join(", ") : ``} }}
522
- >
523
- {(${finalFormRenderProps.length ? `{${finalFormRenderProps.join(", ")}}` : ``}) => (
524
- ${editMode ? `<>` : ``}
525
- ${editMode ? `{saveConflict.dialogs}` : ``}
526
- <>
527
- ${fieldsCode}
528
- </>
529
- ${editMode ? `</>` : ``}
530
- )}
531
- </FinalForm>
532
- );
533
- }
534
-
535
- `;
536
- return {
537
- code,
538
- gqlDocuments,
539
- };
540
- }
541
- /**
542
- * Checks if the provided form config is valid.
543
- *
544
- * Examples of invalid configs:
545
- * - The "id" field is not read-only
546
- *
547
- * @param config The form config to check.
548
- * @throws Will throw an error if the provided config is invalid.
549
- */
550
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
551
- function assertValidConfig(config) {
552
- function validateFields(fields) {
553
- for (const field of fields) {
554
- if ((0, generate_command_1.isFormFieldConfig)(field)) {
555
- if (field.name === "id" && !field.readOnly) {
556
- throw new Error(`Invalid form config: the "id" field must be read-only`);
557
- }
558
- }
559
- else if ((0, generate_command_1.isFormLayoutConfig)(field)) {
560
- validateFields(field.fields);
561
- }
562
- }
563
- }
564
- validateFields(config.fields);
565
- }
@@ -1,12 +0,0 @@
1
- import { type IntrospectionQuery } from "graphql";
2
- import { type FormConfig, type FormFieldConfig } from "../generate-command";
3
- import { type GenerateFieldsReturn } from "./generateFields";
4
- export declare function generateFormField({ gqlIntrospection, baseOutputFilename, config, formConfig, gqlType, namePrefix, }: {
5
- gqlIntrospection: IntrospectionQuery;
6
- baseOutputFilename: string;
7
- config: FormFieldConfig<any>;
8
- formFragmentName: string;
9
- formConfig: FormConfig<any>;
10
- gqlType: string;
11
- namePrefix?: string;
12
- }): GenerateFieldsReturn;