UNPKG

@baseplate-dev/react-generators

Version:

React Generators for Baseplate

76 lines (75 loc) 3.37 kB
import { packageScope, TsCodeUtils, tsImportBuilder, tsTemplate, } from '@baseplate-dev/core-generators'; import { createConfigFieldMap, createGenerator, createGeneratorTask, createProviderType, } from '@baseplate-dev/sync'; import { createFieldMapSchemaBuilder } from '@baseplate-dev/utils'; import { z } from 'zod'; import { reactRouterConfigProvider } from '#src/generators/core/react-router/index.js'; import { authHooksImportsProvider } from '../_providers/auth-hooks.js'; const descriptorSchema = z.object({}); const configSchema = createFieldMapSchemaBuilder((t) => ({ identifyFragments: t.map(), })); export const authIdentifyProvider = createProviderType('auth-identify'); export const authIdentifyGenerator = createGenerator({ name: 'auth/auth-identify', generatorFileUrl: import.meta.url, descriptorSchema, buildTasks: () => ({ authContext: createGeneratorTask({ dependencies: { reactRouterConfig: reactRouterConfigProvider, authHooksImports: authHooksImportsProvider, }, run({ reactRouterConfig, authHooksImports }) { reactRouterConfig.routerSetupFragments.set('auth-context', tsTemplate `const session = ${authHooksImports.useSession.fragment()}();\nconst { userId } = session;`); reactRouterConfig.rootContextFields.add({ name: 'userId', type: tsTemplate `string | undefined`, optional: true, routerProviderInitializer: { code: tsTemplate `userId`, dependencies: ['userId'], }, }); reactRouterConfig.rootContextFields.add({ name: 'session', type: authHooksImports.SessionData.typeFragment(), optional: false, routerProviderInitializer: { code: tsTemplate `session`, dependencies: ['session'], }, }); }, }), main: createGeneratorTask({ dependencies: { reactRouterConfig: reactRouterConfigProvider, }, exports: { authIdentify: authIdentifyProvider.export(packageScope), }, run({ reactRouterConfig }) { const fieldMap = createConfigFieldMap(configSchema); return { providers: { authIdentify: fieldMap, }, build: () => { const { identifyFragments } = fieldMap.getValues(); if (identifyFragments.size > 0) { reactRouterConfig.routerSetupFragments.set('auth-identify', TsCodeUtils.templateWithImports([ tsImportBuilder(['useEffect']).from('react'), ]) ` useEffect(() => { if (!userId) return; ${TsCodeUtils.mergeFragments(identifyFragments)} }, [userId]); `); } }, }; }, }), }), }); //# sourceMappingURL=auth-identify.generator.js.map