@baseplate-dev/react-generators
Version:
React Generators for Baseplate
71 lines • 3.31 kB
JavaScript
import { 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 { reactBaseConfigProvider } from '../react/index.js';
import { CORE_REACT_APP_GENERATED } from './generated/index.js';
const descriptorSchema = z.object({});
const WRAPPER_PRIORITY = {
auth: 0,
data: 1,
router: 2,
};
const [setupTask, reactAppConfigProvider, reactAppConfigValuesProvider] = createConfigProviderTask((t) => ({
errorBoundary: t.scalar(),
renderWrappers: t.map(),
renderSiblings: t.map(),
renderRoot: t.scalar(),
}), {
prefix: 'react-app',
configScope: packageScope,
});
export { reactAppConfigProvider };
export const reactAppGenerator = createGenerator({
name: 'core/react-app',
generatorFileUrl: import.meta.url,
descriptorSchema,
buildTasks: () => ({
setup: setupTask,
paths: CORE_REACT_APP_GENERATED.paths.task,
reactBaseConfig: createProviderTask(reactBaseConfigProvider, (reactBaseConfig) => {
reactBaseConfig.appFragment.set(tsCodeFragment('<App />', tsImportBuilder(['App']).from('@/src/app/app')));
}),
main: createGeneratorTask({
dependencies: {
typescriptFile: typescriptFileProvider,
reactAppConfigValues: reactAppConfigValuesProvider,
paths: CORE_REACT_APP_GENERATED.paths.provider,
},
run({ typescriptFile, reactAppConfigValues: { errorBoundary, renderWrappers, renderSiblings, renderRoot, }, paths, }) {
return {
build: async (builder) => {
const rootWithSiblings = TsCodeUtils.mergeFragmentsPresorted([
renderRoot ?? '<div />',
...sortBy([...renderSiblings.entries()], [([key]) => key]).map(([, sibling]) => sibling),
'\n',
]);
const sortedWrappers = [
errorBoundary,
...sortBy([...renderWrappers.entries()], [
([, wrapper]) => WRAPPER_PRIORITY[wrapper.type],
([key]) => key,
]).map(([, wrapper]) => wrapper.wrap),
].filter((x) => x !== undefined);
let rootWithWrappers = rootWithSiblings;
for (const wrapper of sortedWrappers.toReversed()) {
rootWithWrappers = wrapper(rootWithWrappers);
}
await builder.apply(typescriptFile.renderTemplateFile({
template: CORE_REACT_APP_GENERATED.templates.app,
destination: paths.app,
variables: {
TPL_RENDER_ROOT: rootWithWrappers,
},
}));
},
};
},
}),
}),
});
//# sourceMappingURL=react-app.generator.js.map