UNPKG

@strapi/typescript-utils

Version:

Typescript support for Strapi

75 lines (56 loc) 1.92 kB
'use strict'; const { factory } = require('typescript'); const { values, pipe, map, sortBy } = require('lodash/fp'); const { models } = require('../common'); const { emitDefinitions, format, generateSharedExtensionDefinition } = require('../utils'); const NO_CONTENT_TYPE_PLACEHOLDER_COMMENT = `/* * The app doesn't have any content-types yet. */ `; /** * Generate type definitions for Strapi Content-Types * * @param {object} [options] * @param {object} options.strapi * @param {object} options.logger * @param {string} options.pwd */ const generateContentTypesDefinitions = async (options = {}) => { const { strapi } = options; const { contentTypes } = strapi; const contentTypesDefinitions = pipe( values, sortBy('uid'), map((contentType) => ({ uid: contentType.uid, definition: models.schema.generateSchemaDefinition(contentType), })) )(contentTypes); options.logger.debug(`Found ${contentTypesDefinitions.length} content-types.`); if (contentTypesDefinitions.length === 0) { return { output: NO_CONTENT_TYPE_PLACEHOLDER_COMMENT, stats: {} }; } const formattedSchemasDefinitions = contentTypesDefinitions.reduce((acc, def) => { acc.push( // Definition def.definition, // Add a newline between each interface declaration factory.createIdentifier('\n') ); return acc; }, []); const allDefinitions = [ // Imports ...models.imports.generateImportDefinition(), // Add a newline after the import statement factory.createIdentifier('\n'), // Schemas ...formattedSchemasDefinitions, // Global generateSharedExtensionDefinition('ContentTypeSchemas', contentTypesDefinitions), ]; const output = emitDefinitions(allDefinitions); const formattedOutput = await format(output); return { output: formattedOutput, stats: {} }; }; module.exports = generateContentTypesDefinitions;