UNPKG

@baseplate-dev/react-generators

Version:

React Generators for Baseplate

79 lines 4.07 kB
import { createNodePackagesTask, extractPackageVersions, packageScope, tsCodeFragment, TsCodeUtils, tsImportBuilder, typescriptFileProvider, } from '@baseplate-dev/core-generators'; import { createConfigProviderTask, createGenerator, createGeneratorTask, createProviderTask, } from '@baseplate-dev/sync'; import { sortBy } from 'es-toolkit'; import { z } from 'zod'; import { REACT_PACKAGES } from '#src/constants/react-packages.js'; import { CORE_REACT_CONFIG_GENERATED } from './generated/index.js'; const descriptorSchema = z.object({}); const [setupTask, reactConfigProvider, reactConfigValuesProvider] = createConfigProviderTask((t) => ({ // The config entries for the react app. configEntries: t.map(), // Extra environment variables for the react app in the .env.development file. additionalDevEnvVars: t.map(), }), { prefix: 'react-config', configScope: packageScope, }); export { reactConfigProvider }; export const reactConfigGenerator = createGenerator({ name: 'core/react-config', generatorFileUrl: import.meta.url, descriptorSchema, buildTasks: () => ({ setup: setupTask, nodePackages: createNodePackagesTask({ prod: extractPackageVersions(REACT_PACKAGES, ['zod']), }), paths: CORE_REACT_CONFIG_GENERATED.paths.task, imports: CORE_REACT_CONFIG_GENERATED.imports.task, setupDefaultConfigEntries: createProviderTask(reactConfigProvider, (reactConfig) => { reactConfig.configEntries.set('VITE_ENVIRONMENT', { comment: 'Environment the app is running in', validator: tsCodeFragment(`z.enum(['dev', 'test', 'stage', 'prod'])`, tsImportBuilder(['z']).from('zod')), devDefaultValue: 'dev', }); }), main: createGeneratorTask({ dependencies: { typescriptFile: typescriptFileProvider, reactConfigValues: reactConfigValuesProvider, paths: CORE_REACT_CONFIG_GENERATED.paths.provider, }, run({ typescriptFile, reactConfigValues: { configEntries, additionalDevEnvVars }, paths, }) { return { build: async (builder) => { const sortedConfigEntries = sortBy([...configEntries], [(entry) => entry[0]]); const sortedConfigFields = sortedConfigEntries.map(([key, { comment, validator }]) => TsCodeUtils.template `${comment ? `${TsCodeUtils.formatAsComment(comment)}\n` : ''}${key}: ${validator},`); await builder.apply(typescriptFile.renderTemplateFile({ template: CORE_REACT_CONFIG_GENERATED.templates.config, destination: paths.config, variables: { TPL_CONFIG_SCHEMA: TsCodeUtils.template `{ ${TsCodeUtils.mergeFragmentsPresorted(sortedConfigFields, '\n')} }`, }, })); const devEnvVars = [ ...sortedConfigEntries.map(([key, { devDefaultValue }]) => [ key, devDefaultValue, ]), ...sortBy([...additionalDevEnvVars], [([key]) => key]), ]; if (devEnvVars.length > 0) { const developmentEnvFile = `${devEnvVars .map(([name, value]) => `${name}=${value}`) .join('\n')}\n`; builder.writeFile({ id: 'development-env', destination: '.env.development', contents: developmentEnvFile, }); } }, }; }, }), }), }); //# sourceMappingURL=react-config.generator.js.map