@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.
- package/bin/admin-generator.mjs +3 -0
- package/dist/adminGenerator.d.mts +1 -0
- package/dist/adminGenerator.mjs +4441 -0
- package/dist/index.d.mts +344 -0
- package/dist/index.mjs +4440 -0
- package/package.json +31 -21
- package/bin/admin-generator.js +0 -8
- package/lib/adminGenerator.d.ts +0 -1
- package/lib/adminGenerator.js +0 -8
- package/lib/commands/generate/config/parseConfig.d.ts +0 -1
- package/lib/commands/generate/config/parseConfig.js +0 -72
- package/lib/commands/generate/config/transformConfig.d.ts +0 -7
- package/lib/commands/generate/config/transformConfig.js +0 -264
- package/lib/commands/generate/generate-command.d.ts +0 -340
- package/lib/commands/generate/generate-command.js +0 -112
- package/lib/commands/generate/generateForm/asyncSelect/generateAsyncSelect.d.ts +0 -26
- package/lib/commands/generate/generateForm/asyncSelect/generateAsyncSelect.js +0 -364
- package/lib/commands/generate/generateForm/extractErrorEnums.d.ts +0 -16
- package/lib/commands/generate/generateForm/extractErrorEnums.js +0 -100
- package/lib/commands/generate/generateForm/flatFormFieldsFromFormConfig.d.ts +0 -2
- package/lib/commands/generate/generateForm/flatFormFieldsFromFormConfig.js +0 -22
- package/lib/commands/generate/generateForm/formField/findIntrospectionFieldType.d.ts +0 -6
- package/lib/commands/generate/generateForm/formField/findIntrospectionFieldType.js +0 -22
- package/lib/commands/generate/generateForm/formField/options.d.ts +0 -24
- package/lib/commands/generate/generateForm/formField/options.js +0 -85
- package/lib/commands/generate/generateForm/generateComponentFormField.d.ts +0 -5
- package/lib/commands/generate/generateForm/generateComponentFormField.js +0 -22
- package/lib/commands/generate/generateForm/generateErrorHandling.d.ts +0 -8
- package/lib/commands/generate/generateForm/generateErrorHandling.js +0 -24
- package/lib/commands/generate/generateForm/generateErrorMessages.d.ts +0 -11
- package/lib/commands/generate/generateForm/generateErrorMessages.js +0 -28
- package/lib/commands/generate/generateForm/generateFields.d.ts +0 -42
- package/lib/commands/generate/generateForm/generateFields.js +0 -87
- package/lib/commands/generate/generateForm/generateForm.d.ts +0 -14
- package/lib/commands/generate/generateForm/generateForm.js +0 -565
- package/lib/commands/generate/generateForm/generateFormField.d.ts +0 -12
- package/lib/commands/generate/generateForm/generateFormField.js +0 -368
- package/lib/commands/generate/generateForm/generateFormLayout.d.ts +0 -12
- package/lib/commands/generate/generateForm/generateFormLayout.js +0 -154
- package/lib/commands/generate/generateForm/generateFormValues.d.ts +0 -40
- package/lib/commands/generate/generateForm/generateFormValues.js +0 -219
- package/lib/commands/generate/generateForm/generateFragmentByFormFragmentFields.d.ts +0 -11
- package/lib/commands/generate/generateForm/generateFragmentByFormFragmentFields.js +0 -29
- package/lib/commands/generate/generateForm/getForwardedGqlArgs.d.ts +0 -18
- package/lib/commands/generate/generateForm/getForwardedGqlArgs.js +0 -79
- package/lib/commands/generate/generateGrid/detectMuiXVersion.d.ts +0 -5
- package/lib/commands/generate/generateGrid/detectMuiXVersion.js +0 -32
- package/lib/commands/generate/generateGrid/findInputObjectType.d.ts +0 -2
- package/lib/commands/generate/generateGrid/findInputObjectType.js +0 -15
- package/lib/commands/generate/generateGrid/generateGqlFieldList.d.ts +0 -6
- package/lib/commands/generate/generateGrid/generateGqlFieldList.js +0 -56
- package/lib/commands/generate/generateGrid/generateGrid.d.ts +0 -16
- package/lib/commands/generate/generateGrid/generateGrid.js +0 -1017
- package/lib/commands/generate/generateGrid/generateGridToolbar.d.ts +0 -15
- package/lib/commands/generate/generateGrid/generateGridToolbar.js +0 -90
- package/lib/commands/generate/generateGrid/getForwardedGqlArgs.d.ts +0 -13
- package/lib/commands/generate/generateGrid/getForwardedGqlArgs.js +0 -59
- package/lib/commands/generate/generateGrid/getPropsForFilterProp.d.ts +0 -14
- package/lib/commands/generate/generateGrid/getPropsForFilterProp.js +0 -13
- package/lib/commands/generate/generateGrid/usableFields.d.ts +0 -14
- package/lib/commands/generate/generateGrid/usableFields.js +0 -3
- package/lib/commands/generate/utils/camelCaseToHumanReadable.d.ts +0 -1
- package/lib/commands/generate/utils/camelCaseToHumanReadable.js +0 -7
- package/lib/commands/generate/utils/columnVisibility.d.ts +0 -6
- package/lib/commands/generate/utils/columnVisibility.js +0 -2
- package/lib/commands/generate/utils/convertConfigImport.d.ts +0 -6
- package/lib/commands/generate/utils/convertConfigImport.js +0 -14
- package/lib/commands/generate/utils/findMutationType.d.ts +0 -3
- package/lib/commands/generate/utils/findMutationType.js +0 -18
- package/lib/commands/generate/utils/findQueryType.d.ts +0 -2
- package/lib/commands/generate/utils/findQueryType.js +0 -18
- package/lib/commands/generate/utils/findRootBlocks.d.ts +0 -8
- package/lib/commands/generate/utils/findRootBlocks.js +0 -66
- package/lib/commands/generate/utils/generateGqlOperation.d.ts +0 -12
- package/lib/commands/generate/utils/generateGqlOperation.js +0 -87
- package/lib/commands/generate/utils/generateImportsCode.d.ts +0 -6
- package/lib/commands/generate/utils/generateImportsCode.js +0 -31
- package/lib/commands/generate/utils/intl.d.ts +0 -20
- package/lib/commands/generate/utils/intl.js +0 -44
- package/lib/commands/generate/utils/isFieldOptional.d.ts +0 -7
- package/lib/commands/generate/utils/isFieldOptional.js +0 -21
- package/lib/commands/generate/utils/runtimeTypeGuards.d.ts +0 -20
- package/lib/commands/generate/utils/runtimeTypeGuards.js +0 -22
- package/lib/commands/generate/utils/writeGenerated.d.ts +0 -1
- package/lib/commands/generate/utils/writeGenerated.js +0 -123
- package/lib/index.d.ts +0 -2
- 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;
|