@baseplate-dev/react-generators
Version:
React Generators for Baseplate
52 lines • 2.14 kB
JavaScript
import { tsCodeFragment } from '@baseplate-dev/core-generators';
import { createGenerator, createGeneratorTask } from '@baseplate-dev/sync';
import { z } from 'zod';
import { reactComponentsImportsProvider } from '#src/generators/core/react-components/index.js';
import { adminCrudInputContainerProvider } from '../_providers/admin-crud-input-container.js';
const descriptorSchema = z.object({
label: z.string().min(1),
order: z.number(),
modelField: z.string().min(1),
validation: z.string().min(1),
type: z.enum(['text', 'checked', 'date', 'dateTime']).default('text'),
});
const INPUT_TYPE_MAP = {
checked: 'CheckboxFieldController',
date: 'DatePickerFieldController',
dateTime: 'DateTimePickerFieldController',
text: 'InputFieldController',
};
export const adminCrudTextInputGenerator = createGenerator({
name: 'admin/admin-crud-text-input',
generatorFileUrl: import.meta.url,
descriptorSchema,
getInstanceName: (descriptor) => descriptor.modelField,
buildTasks: ({ label, modelField, validation, type, order }) => ({
main: createGeneratorTask({
dependencies: {
adminCrudInputContainer: adminCrudInputContainerProvider,
reactComponentsImports: reactComponentsImportsProvider,
},
run({ adminCrudInputContainer, reactComponentsImports }) {
const inputType = INPUT_TYPE_MAP[type];
adminCrudInputContainer.addInput({
order,
content: tsCodeFragment(`<${inputType}
label="${label}"
control={control}
name="${modelField}"
/>`, reactComponentsImports[inputType].declaration()),
graphQLFields: [{ name: modelField }],
validation: [
{
key: modelField,
expression: tsCodeFragment(validation),
},
],
});
return {};
},
}),
}),
});
//# sourceMappingURL=admin-crud-text-input.generator.js.map