@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
97 lines (96 loc) • 4.18 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.printRelations = exports.printModels = void 0;
const chalk_1 = __importDefault(require("chalk"));
const dataModel_1 = require("../dataModel");
const lodash_1 = require("../lodash");
const SPACE = ' ';
const graphqlType = (field) => {
let value = field.getTypename();
if (field.isList()) {
value = field.isNonNullItem() ? `[${value}!]` : `[${value}]`;
}
if (field.isNonNull()) {
value = `${value}!`;
}
return value;
};
const fieldMessages = (fields) => {
return (0, lodash_1.values)((0, lodash_1.mapValues)(fields, (field, key) => {
const relationMessage = field instanceof dataModel_1.RelationField ? `@relation(name: ${field.getRelationName()})` : '';
return `${SPACE.repeat(4)}${chalk_1.default.green('Field')}: ${key} ${chalk_1.default.cyan(`\`${graphqlType(field)}\``)} ${relationMessage}`;
}));
};
const modelMessages = (models) => {
return (0, lodash_1.flatten)(models.map(model => {
const modelType = 'Model';
const title = `${SPACE.repeat(4)}- ${modelType} ${chalk_1.default.bold(model.getNamings().capitalSingular)} ${chalk_1.default.gray(`(generated from '${model.getName()}')`)}`;
return [title, ...fieldMessages(model.getFields()), '\n'];
}));
};
const getReadableNameOfRelationType = (relationType) => {
switch (relationType) {
case dataModel_1.RelationType.uniManyToOne:
return 'Unidirectional Many-to-One';
case dataModel_1.RelationType.uniOneToMany:
return 'Unidirectional One-to-Many';
case dataModel_1.RelationType.uniOneToOne:
return 'Unidirectional One-to-One';
case dataModel_1.RelationType.biOneToOne:
return 'Bidirectional One-to-One';
case dataModel_1.RelationType.biOneToMany:
return 'Bidirectional One-to-Many';
case dataModel_1.RelationType.biManyToMany:
return 'Bidirectional Many-to-Many';
default:
throw new Error(`no relationType ${relationType} found`);
}
};
const getSidesOfRelation = (relation) => {
const sourceName = relation.source.getNamings().capitalSingular;
const targetName = relation.target.getNamings().capitalSingular;
let relationSymbol;
switch (relation.type) {
case dataModel_1.RelationType.uniManyToOne:
relationSymbol = '*-1';
break;
case dataModel_1.RelationType.uniOneToMany:
case dataModel_1.RelationType.biOneToMany:
relationSymbol = '1-*';
break;
case dataModel_1.RelationType.uniOneToOne:
case dataModel_1.RelationType.biOneToOne:
relationSymbol = '1-1';
break;
case dataModel_1.RelationType.biManyToMany:
relationSymbol = '*-*';
break;
default:
throw new Error(`no relationType ${relation.type} found`);
}
return `${relationSymbol} on \`${sourceName}\`-\`${targetName}\``;
};
const relationMessages = (relations) => {
return (0, lodash_1.flatten)(relations.map(relation => {
const title = `${SPACE.repeat(4)}Relation ${chalk_1.default.bold(relation.name)}`;
const type = `${SPACE.repeat(6)}* ${chalk_1.default.cyan('Type')}: ${getReadableNameOfRelationType(relation.type)}`;
const sides = `${SPACE.repeat(6)}* ${chalk_1.default.cyan('Relationship')}: ${getSidesOfRelation(relation)}`;
return [title, type, sides, '\n'];
}));
};
const printModels = (models) => {
console.log(chalk_1.default.bold(`${SPACE.repeat(2)}- Grapi Models`));
modelMessages(models).forEach(line => console.log(line));
};
exports.printModels = printModels;
const printRelations = (relations) => {
if ((0, lodash_1.isEmpty)(relations)) {
return;
}
console.log(chalk_1.default.bold(`${SPACE.repeat(2)}- Relations`));
relationMessages(relations).forEach(line => console.log(line));
};
exports.printRelations = printRelations;