UNPKG

@baseplate-dev/react-generators

Version:

React Generators for Baseplate

58 lines 2.55 kB
import { tsCodeFragment, tsHoistedFragment, } from '@baseplate-dev/core-generators'; import { createGenerator, createGeneratorTask } from '@baseplate-dev/sync'; import { quot } from '@baseplate-dev/utils'; 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), isOptional: z.boolean().optional(), options: z.array(z.object({ label: z.string().min(1), value: z.string().min(1), })), }); export const adminCrudEnumInputGenerator = createGenerator({ name: 'admin/admin-crud-enum-input', generatorFileUrl: import.meta.url, descriptorSchema, getInstanceName: (descriptor) => descriptor.modelField, buildTasks: ({ label, modelField, options, isOptional, order }) => ({ main: createGeneratorTask({ dependencies: { adminCrudInputContainer: adminCrudInputContainerProvider, reactComponentsImports: reactComponentsImportsProvider, }, run({ adminCrudInputContainer, reactComponentsImports }) { adminCrudInputContainer.addInput({ order, content: tsCodeFragment(`<SelectFieldController label="${label}" control={control} name="${modelField}" options={${modelField}Options} />`, reactComponentsImports.SelectFieldController.declaration(), { hoistedFragments: [ tsHoistedFragment(`${modelField}Options`, `const ${modelField}Options = [ ${options .map((option) => `{ label: ${quot(option.label)}, value: ${quot(option.value)} }`) .join(',\n')} ];`), ], }), graphQLFields: [{ name: modelField }], validation: [ { key: modelField, expression: tsCodeFragment(`z.enum([${options.map((o) => `"${o.value}"`).join(', ')}])${isOptional ? '.nullish()' : ''}`), }, ], }); return {}; }, }), }), }); //# sourceMappingURL=admin-crud-enum-input.generator.js.map