UNPKG

@iotechpis/strapi-plugin-schemas-to-ts

Version:

A Strapi plugin that automatically generates Typescript interfaces for Strapi entities and components.

97 lines (96 loc) 4.32 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Converter = void 0; const lodash_1 = require("lodash"); const pascal_case_1 = require("pascal-case"); const prettier_1 = __importDefault(require("prettier")); const schemaSource_1 = require("../models/schemaSource"); const register_1 = require("../register"); const commonHelpers_1 = require("./commonHelpers"); const fileHelpers_1 = require("./fileHelpers"); const interfaceBuilder_1 = require("./interface-builders/interfaceBuilder"); class Converter { constructor(strapi, config) { this.config = config; this.contentTypes = (0, lodash_1.cloneDeep)(strapi.contentTypes); this.commonHelpers = new commonHelpers_1.CommonHelpers(config); this.interfaceBuilder = new interfaceBuilder_1.InterfaceBuilder(config); this.commonHelpers.printVerboseLog(`${register_1.pluginName} configuration`, this.config); } async setPrettierOptions() { this.prettierOptions = await this.commonHelpers.getPrettierOptions(); } SchemasToTs() { const currentNodeEnv = process.env.NODE_ENV ?? ''; const acceptedNodeEnvs = this.config.acceptedNodeEnvs ?? []; if (!acceptedNodeEnvs.includes(currentNodeEnv)) { console.log(`${register_1.pluginName} plugin's acceptedNodeEnvs property does not include '${currentNodeEnv}' environment. Skipping conversion of schemas to Typescript.`); return; } const schemas = []; for (const uid in this.contentTypes) { if (this.interfaceBuilder.shouldSkipSchema(uid)) { console.log(`Skipping schema ${uid}`); continue; } if (this.contentTypes[uid].info.singularName == 'file') { this.contentTypes[uid].info.singularName = 'media'; } schemas.push(this.parseSchema(this.contentTypes[uid], schemaSource_1.SchemaSource.Api)); } for (const schema of schemas) { this.interfaceBuilder.convertSchemaToInterfaces(schema, schemas); } this.writeInterfacesFile(schemas); } parseSchema(schema, schemaSource) { let schemaName = ''; switch (schemaSource) { case schemaSource_1.SchemaSource.Api: schemaName = schema.info.singularName; break; case schemaSource_1.SchemaSource.Common: schemaName = schema.info.displayName; break; case schemaSource_1.SchemaSource.Component: // let fileNameWithoutExtension = path.basename(file, path.extname(file)); // schemaName = fileNameWithoutExtension; // folder = path.join(path.dirname(file), this.componentInterfacesFolderName); // if (!FileHelpers.folderExists(folder)) { // fs.mkdirSync(folder); // } break; } let pascalName = (0, pascal_case_1.pascalCase)(schemaName); let needsComponentSuffix = schemaSource === schemaSource_1.SchemaSource.Component && this.config.alwaysAddComponentSuffix; if (needsComponentSuffix) { pascalName += 'Component'; } return { schema: schema, schemaName: schemaName, pascalName: pascalName, needsComponentSuffix: needsComponentSuffix, source: schemaSource, interfaceAsText: '', plainInterfaceAsText: '', enums: [], }; } async writeInterfacesFile(schemas) { let interfacesFileContent = await this.interfaceBuilder.buildInterfacesFileContent(schemas); await this.setPrettierOptions(); if (this.prettierOptions) { const options = this.prettierOptions; if (!options.parser) { options.parser = 'typescript'; } interfacesFileContent = await prettier_1.default.format(interfacesFileContent, options); } fileHelpers_1.FileHelpers.writeInterfaceFile('', 'contentTypes.d.ts', interfacesFileContent); } } exports.Converter = Converter;