mirror of
				https://github.com/strapi/strapi.git
				synced 2025-10-31 09:56:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Schema definition language tools
 | |
|  */
 | |
| 
 | |
| 'use strict';
 | |
| 
 | |
| const _ = require('lodash');
 | |
| 
 | |
| /**
 | |
|  * Retrieves a type description from its configuration or its related model
 | |
|  * @return String
 | |
|  */
 | |
| const getTypeDescription = (type, model = {}) => {
 | |
|   const str = _.get(type, '_description') || _.get(model, 'info.description');
 | |
| 
 | |
|   if (str) {
 | |
|     return `"""\n${str}\n"""\n`;
 | |
|   }
 | |
| 
 | |
|   return '';
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Receive an Object and return a string which is following the GraphQL specs.
 | |
|  * @param {Object} fields
 | |
|  * @param {Object} description
 | |
|  * @param {Object} model the underlying strapi model of those fields
 | |
|  * @param {string} type the type of object we are converting to SQL (query, mutation, or fields)
 | |
|  */
 | |
| const toSDL = (fields, configurations = {}, model = {}, type = 'field') => {
 | |
|   if (['query', 'mutation'].includes(type)) {
 | |
|     return operationToSDL({ fields, configurations });
 | |
|   }
 | |
| 
 | |
|   return fieldsToSDL({ fields, model, configurations });
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Generated a SDL for a type
 | |
|  * @param {Object} options
 | |
|  * @param {Object} options.fields fields to convert to SDL
 | |
|  * @param {Object} options.configurations fields configurations (descriptions and deprecations)
 | |
|  * @param {Object} options.model the underlying strapi model of those fields
 | |
|  */
 | |
| const fieldsToSDL = ({ fields, configurations, model }) => {
 | |
|   return Object.entries(fields)
 | |
|     .map(([key, value]) => {
 | |
|       const [attr] = key.split('(');
 | |
|       const attributeName = _.trim(attr);
 | |
| 
 | |
|       const description = _.isString(configurations[attributeName])
 | |
|         ? configurations[attributeName]
 | |
|         : _.get(configurations, [attributeName, 'description']) ||
 | |
|           _.get(model, ['attributes', attributeName, 'description']);
 | |
| 
 | |
|       const deprecated =
 | |
|         _.get(configurations, [attributeName, 'deprecated']) ||
 | |
|         _.get(model, ['attributes', attributeName, 'deprecated']);
 | |
| 
 | |
|       return applyMetadatas(`${key}: ${value}`, { description, deprecated });
 | |
|     })
 | |
|     .join('\n');
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Generated a SDL for a query or a mutation object
 | |
|  * @param {Object} options
 | |
|  * @param {Object} options.fields fields to convert to SDL
 | |
|  * @param {Object} options.configurations fields configurations (descriptions and deprecations)
 | |
|  */
 | |
| const operationToSDL = ({ fields, configurations }) => {
 | |
|   return Object.entries(fields)
 | |
|     .map(([key, value]) => {
 | |
|       const [attr] = key.split('(');
 | |
|       const attributeName = _.trim(attr);
 | |
| 
 | |
|       return applyMetadatas(`${key}: ${value}`, configurations[attributeName]);
 | |
|     })
 | |
|     .join('\n');
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Applies description and deprecated to a field definition
 | |
|  * @param {string} definition field definition
 | |
|  * @param {Object} metadatas field metadatas
 | |
|  * @param {string} metadatas.description field description
 | |
|  * @param {string} metadatas.deprecated field deprecation
 | |
|  */
 | |
| const applyMetadatas = (definition, metadatas = {}) => {
 | |
|   const { description, deprecated } = metadatas;
 | |
| 
 | |
|   let tmpDef = definition;
 | |
|   if (description) {
 | |
|     tmpDef = `"""\n${description}\n"""\n${tmpDef}`;
 | |
|   }
 | |
| 
 | |
|   if (deprecated) {
 | |
|     tmpDef = `${tmpDef} @deprecated(reason: "${deprecated}")`;
 | |
|   }
 | |
| 
 | |
|   return tmpDef;
 | |
| };
 | |
| 
 | |
| module.exports = {
 | |
|   toSDL,
 | |
|   getTypeDescription,
 | |
| };
 | 
