@baseplate-dev/react-generators
Version:
React Generators for Baseplate
56 lines • 2.46 kB
JavaScript
import { tsCodeFragment, tsImportBuilder, tsTypeImportBuilder, } from '@baseplate-dev/core-generators';
import { pluralize } from 'inflection';
import { lowerCaseFirst } from '#src/utils/case.js';
import { mergeGraphQLFields } from '#src/writers/graphql/index.js';
import { convertExpressionToField } from './graphql.js';
export function createForeignDataDependency({ foreignModelName, modelName, reactApollo, labelExpression, valueExpression, }) {
const fragmentName = `${modelName}${foreignModelName}Option`;
const dataName = `${fragmentName}s`;
const propName = lowerCaseFirst(dataName);
const querySubcomponent = lowerCaseFirst(pluralize(foreignModelName));
const loaderValueName = `${lowerCaseFirst(dataName)}Data`;
const loaderErrorName = `${lowerCaseFirst(dataName)}Error`;
const dataDependency = {
propName,
propType: tsCodeFragment(`${fragmentName}Fragment[]`, tsTypeImportBuilder([`${fragmentName}Fragment`]).from(reactApollo.getGeneratedFilePath())),
graphFragments: [
{
name: fragmentName,
type: foreignModelName,
fields: mergeGraphQLFields([
convertExpressionToField(labelExpression),
convertExpressionToField(valueExpression),
]),
},
],
graphRoots: [
{
type: 'query',
name: `Get${dataName}`,
fields: [
{
type: 'simple',
name: querySubcomponent,
fields: [
{
type: 'spread',
on: fragmentName,
},
],
},
],
},
],
loader: {
loader: tsCodeFragment(`const { data: ${loaderValueName}, error: ${loaderErrorName} } = useQuery(Get${dataName}Document);`, [
tsImportBuilder([`useQuery`]).from('@apollo/client'),
tsImportBuilder([`Get${dataName}Document`]).from(reactApollo.getGeneratedFilePath()),
]),
loaderErrorName,
loaderValueName,
},
propLoaderValueGetter: (value) => `${value}.${querySubcomponent}`,
};
return { dataDependency, propName };
}
//# sourceMappingURL=foreign-data-dependency.js.map