@graphql-codegen/flutter-freezed
Version:
GraphQL Code Generator plugin to generate Freezed models from your GraphQL schema
94 lines (93 loc) • 5.03 kB
JavaScript
import { indent } from '@graphql-codegen/visitor-plugin-common';
import { Config } from '../config/config-value.js';
import { TypeName } from '../config/pattern.js';
import { APPLIES_ON_DEFAULT_FACTORY, APPLIES_ON_DEFAULT_FACTORY_PARAMETERS, APPLIES_ON_MERGED_FACTORY, APPLIES_ON_MERGED_FACTORY_PARAMETERS, APPLIES_ON_UNION_FACTORY, APPLIES_ON_UNION_FACTORY_PARAMETERS, } from '../config/plugin-config.js';
import { stringIsNotEmpty } from '../utils.js';
import { Block } from './index.js';
import { ParameterBlock } from './parameter-block.js';
export class FactoryBlock {
static build(config, node, blockAppliesOn, className, factoryName) {
let block = '';
block += Block.buildComment(node);
block += this.buildDecorators(config, blockAppliesOn, className, factoryName);
block += this.buildHeader(config, blockAppliesOn, className, factoryName);
block += this.buildBody(config, node, blockAppliesOn);
factoryName = blockAppliesOn.includes('default_factory') ? className : factoryName;
block += this.buildFooter(config, blockAppliesOn, factoryName);
return block;
}
}
FactoryBlock.buildDecorators = (config, blockAppliesOn, className, factoryName) => {
// TODO: @Assert
const typeName = factoryName
? TypeName.fromUnionOfTypeNames(className, factoryName)
: className;
const deprecatedDecorator = Config.deprecated(config, blockAppliesOn, typeName);
const decorators = [deprecatedDecorator].join('');
return stringIsNotEmpty(decorators) ? indent(decorators) : decorators;
};
FactoryBlock.buildHeader = (config, blockAppliesOn, className, factoryName) => {
const typeName = factoryName
? TypeName.fromUnionOfTypeNames(className, factoryName)
: className;
const immutable = Config.immutable(config, typeName);
// const mutableInputs = Config.mutableInputs(config, factoryName);
// const mutable = immutable !== true || (node.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION && mutableInputs);
const constFactory = immutable ? indent('const factory') : indent('factory');
const _className = Block.buildBlockName(config, blockAppliesOn, className.value, className, undefined, 'PascalCase');
if (factoryName) {
const _factoryName = Block.buildBlockName(config, blockAppliesOn, factoryName.value, factoryName, undefined, 'camelCase');
return `${constFactory} ${_className}.${_factoryName}({\n`;
}
return `${constFactory} ${_className}({\n`;
};
FactoryBlock.buildBody = (config, node, appliesOn) => {
var _a, _b;
let appliesOnParameters = [];
if (appliesOn.includes('default_factory')) {
appliesOnParameters = APPLIES_ON_DEFAULT_FACTORY_PARAMETERS;
}
else if (appliesOn.includes('union_factory')) {
appliesOnParameters = APPLIES_ON_UNION_FACTORY_PARAMETERS;
}
else if (appliesOn.includes('merged_factory')) {
appliesOnParameters = APPLIES_ON_MERGED_FACTORY_PARAMETERS;
}
return ((_b = (_a = node.fields) === null || _a === void 0 ? void 0 : _a.map((field) => {
return ParameterBlock.build(config, node, field, appliesOnParameters);
}).join('')) !== null && _b !== void 0 ? _b : '');
};
FactoryBlock.buildFooter = (config, blockAppliesOn, factoryName) => {
const _ = blockAppliesOn.includes('default_factory') ? '_' : '';
const _factoryName = Block.buildBlockName(config, blockAppliesOn, factoryName.value, factoryName, undefined, 'PascalCase');
return indent(`}) = ${_}${_factoryName};\n\n`);
};
FactoryBlock.serializeDefaultFactory = (className) => {
return `${Block.tokens.defaultFactory}${className.value}==>${APPLIES_ON_DEFAULT_FACTORY.join(',')}\n`;
};
FactoryBlock.serializeUnionFactory = (className, factoryName) => {
return `${Block.tokens.unionFactory}${className.value}==>${factoryName.value}==>${APPLIES_ON_UNION_FACTORY.join(',')}\n`;
};
FactoryBlock.serializeMergedFactory = (className, factoryName) => {
return `${Block.tokens.mergedFactory}${className.value}==>${factoryName.value}==>${APPLIES_ON_MERGED_FACTORY.join(',')}\n`;
};
FactoryBlock.deserializeFactory = (config, nodeRepository, blockAppliesOn, className) => {
const node = nodeRepository.get(className.value);
if (node) {
return FactoryBlock.buildFromFactory(config, node, blockAppliesOn, className);
}
return '';
};
FactoryBlock.deserializeNamedFactory = (config, nodeRepository, blockAppliesOn, className, factoryName) => {
const node = nodeRepository.get(factoryName.value);
if (node) {
return FactoryBlock.buildFromNamedFactory(config, node, blockAppliesOn, className, factoryName);
}
return '';
};
FactoryBlock.buildFromFactory = (config, node, blockAppliesOn, className) => {
return FactoryBlock.build(config, node, blockAppliesOn, className);
};
FactoryBlock.buildFromNamedFactory = (config, node, blockAppliesOn, className, factoryName) => {
return FactoryBlock.build(config, node, blockAppliesOn, className, factoryName);
};